有時候真是挺幸運,正當我自以為是地認為掌握了某個知識點的時候,現實就會馬上出現另外一個問題,讓我知道之前的認知是不全面的。
正如我上篇博文中所述,如果一個自增字段達到了上限,而且繼續向裡面插入數據的話會出現 Failed to read auto-increment value from storage engine 的提示。但是今天遇到了另一個錯誤提示:Duplicate entry '127' for key 'PRIMARY',經過排查同樣是因為自增字段達到了上限。那為什麼同一個問題會出現不同的提示呢?
測試結果是這樣的:
1、如果這個時候數據表裡面沒有數據,而且我們用使用 INSERT INTO VALUES 這樣的語句插入,就會提示 Duplicate entry '127' for key 'PRIMARY' 這類的字樣。(因為我設置的測試字段是tinyint,所以是127)
2、如果這個時候數據表裡面沒有數據,而且我們使用 INSERTINTO SELECT FROM 這樣的語句插入,並且存儲引擎是INNODB的話,就會提示 Failed to read auto-increment value from storage engine 這樣的錯誤;
3、如果這個時候數據表裡面有數據,則總是會出現Duplicate entry '127' for key 'PRIMARY' 這類的字樣的錯誤。
所以,出現Duplicate entry '127' for key 'PRIMARY' 這個時容易理解的。而另外一個提示是因為INNODB 引擎特有的二級緩存所導致的。數據不會先插入數據表,而會先存到緩存裡面,只是增加表裡的自增數。所以當自增數達到極限時,InnoDB要獲取自增值然後存儲到緩存的時候,發現找不到更高的數字了。