Mysql更新自增主鍵id遇到的問題
本是一個自己知道的問題,還是差點踩坑(差點忘了,還好上線前整理上線點時想起來了),特此記錄下來
為什么要更新自增id
我是因為歷史業(yè)務(wù)上的坑,導(dǎo)致必須更新一批id,且為了避免沖突需要將id擴(kuò)大多少倍進(jìn)行更新,因為我這個表的數(shù)據(jù)數(shù)量不高,屬于高讀低寫的情況,所以就簡單的擴(kuò)大了1000
問題
MySQL中如果我們把自增主鍵更新為更大的值(例如現(xiàn)在自增id最大值是1000,你更新id=49這個記錄到id=1049),MySQL并不會把表的自增值修改為更新后的值,在某些情況下,如DDL,重啟等之后,業(yè)務(wù)開始報錯,這時如果不知道當(dāng)前操作可能會誤認(rèn)為是當(dāng)前業(yè)務(wù)操作的問題,實則是因為更新id埋下的坑(主鍵沖突)
如下圖:
圖1:更新前原始數(shù)據(jù)
執(zhí)行更新語句
update test set id = 10 where id = 2;
圖2:更新后的數(shù)據(jù)
執(zhí)行新的插入語句
insert test (name) values ('dddd')
圖3:插入的新數(shù)據(jù)
想必這時大家也都看出問題了,更新后可能剛開始沒有問題,但當(dāng)自增id追上你更新的最大值后,id沖突在所難免了。。。
如何解決
1.如果是個人測試庫,不怎么重要,可以重啟數(shù)據(jù)庫
2.當(dāng)然線上數(shù)據(jù)庫是沒法按照1這種方式搞了,除非你很任性(還需要dba陪著你任性),,,這時可以嘗試指定id插入一條業(yè)務(wù)上無意義的數(shù)據(jù),例如軟刪除的數(shù)據(jù),(我的案列表沒有軟刪除標(biāo)識,大家可以意會下)
insert test (id,name) values (20,'eeee');
操作后如圖:
在執(zhí)行下面SQL語句,對照結(jié)果
insert test (name) values ('ffff');
此時自增id已從最大值開始自增了
找資料發(fā)現(xiàn),這個BUG在2005年就被提出了,因為性能以及場景很少的沒有被修復(fù);這個問題在MySQL 8.0.11中表現(xiàn)正常。
到此這篇關(guān)于Mysql更新自增主鍵id遇到的問題的文章就介紹到這了,更多相關(guān)Mysql更新自增主鍵id內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!