有時(shí)候真是挺幸運(yùn),正當(dāng)我自以為是地認(rèn)為掌握了某個(gè)知識(shí)點(diǎn)的時(shí)候,現(xiàn)實(shí)就會(huì)馬上出現(xiàn)另外一個(gè)問(wèn)題,讓我知道之前的認(rèn)知是不全面的。
正如我上篇博文中所述,如果一個(gè)自增字段達(dá)到了上限,而且繼續(xù)向里面插入數(shù)據(jù)的話會(huì)出現(xiàn) Failed to read auto-increment value from storage engine 的提示。但是今天遇到了另一個(gè)錯(cuò)誤提示:Duplicate entry '127' for key 'PRIMARY',經(jīng)過(guò)排查同樣是因?yàn)樽栽鲎侄芜_(dá)到了上限。那為什么同一個(gè)問(wèn)題會(huì)出現(xiàn)不同的提示呢?
測(cè)試結(jié)果是這樣的:
1、如果這個(gè)時(shí)候數(shù)據(jù)表里面沒(méi)有數(shù)據(jù),而且我們用使用 INSERT INTO VALUES 這樣的語(yǔ)句插入,就會(huì)提示 Duplicate entry '127' for key 'PRIMARY' 這類的字樣。(因?yàn)槲以O(shè)置的測(cè)試字段是tinyint,所以是127)
2、如果這個(gè)時(shí)候數(shù)據(jù)表里面沒(méi)有數(shù)據(jù),而且我們使用 INSERTINTO SELECT FROM 這樣的語(yǔ)句插入,并且存儲(chǔ)引擎是INNODB的話,就會(huì)提示 Failed to read auto-increment value from storage engine 這樣的錯(cuò)誤;
3、如果這個(gè)時(shí)候數(shù)據(jù)表里面有數(shù)據(jù),則總是會(huì)出現(xiàn)Duplicate entry '127' for key 'PRIMARY' 這類的字樣的錯(cuò)誤。
所以,出現(xiàn)Duplicate entry '127' for key 'PRIMARY' 這個(gè)時(shí)容易理解的。而另外一個(gè)提示是因?yàn)镮NNODB 引擎特有的二級(jí)緩存所導(dǎo)致的。數(shù)據(jù)不會(huì)先插入數(shù)據(jù)表,而會(huì)先存到緩存里面,只是增加表里的自增數(shù)。所以當(dāng)自增數(shù)達(dá)到極限時(shí),InnoDB要獲取自增值然后存儲(chǔ)到緩存的時(shí)候,發(fā)現(xiàn)找不到更高的數(shù)字了。
bitsCN.com聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com