Mysql更新自增主鍵id遇到的問題

2022-09-21 00:36:05 字數 934 閱讀 5703

目錄

本是乙個自己知道的問題,還是差點踩坑(差點忘了,還好上線前整理上線點時想起來了),特此記錄下來

我是因為歷史業務上的坑,導致必須更新一批id,且為了避免衝突需要將id擴大多少倍進行更新,因為我這個表的資料數量不高,屬於高讀低寫的情況,所以就簡單的擴大了1000

mysql中如果我們把自增主鍵更新為更大的值(例如現在自增id最大值是1000,你更新id=49這個記錄到id=1049),mysql並不會把錶的自增值修改為更新後的值,在某些情況下,如ddl,重啟等之後,業務開始xexyvwf報錯,這時如果不知道當前操作可能會誤認為是當前業務操作的問題,實則是因為更新id埋下的坑(主鍵衝突)

如下圖:

圖1:更新前原始資料

執行更新語句

update test set id = 10 where id = 2;

圖2:更新後的資料

執行新的插入語句

insert test (name) values ('dddd')

圖3:插入的新資料

想必這時大家也都看出問題了,更新後可能剛開始沒有問題,但當自增id追上你更新的最大值後,id衝突在所難免了。。。

1.如果是個人測試庫,不怎麼重要,可以重啟資料庫

2.當然線上資料庫是沒法按照1這種方式搞了,除非你很任性(還需要dba陪著你任性),,,這時可以嘗試指定id插入一條業務上無意義的資料,例如軟刪除的資料,(我的案列表沒有軟刪除標識,大家可以意會下)

insert test (id,name) values (20,'eeee');

操作後如圖:

在執行下面sql語句,對照結果

insert test (name) values ('ffff');

此時自增id已從最大值開始自增了

找資料發現,這個bug在2023年就被提出了,因為效能以及場景很少的沒有被修復;這個問題在mysql 8.0.11中表現正常。

mysql 主鍵自增語句 MySQL 自增主鍵

以下僅考慮 innodb 儲存引擎。自增主鍵有兩個性質需要考慮 單調性每次插入一條資料,其 id 都是比上一條插入的資料的 id 大,就算上一條資料被刪除。連續性插入成功時,其資料的 id 和前一次插入成功時資料的 id 相鄰。自增主鍵的單調性 為何會有單調性的問題?這主要跟自增主鍵最大值的獲取方式...

Mysql自增主鍵ID調整 重新排序

mysql資料庫表的自增主鍵id號亂了,需要重新排列。原理 刪除原有的自增id,重新建立新的自增id。1,刪除原有主鍵 alter table table name drop id 2,新增新主鍵字段 alter table table name add id mediumint 8 not nul...

Mysql自增主鍵ID調整 重新排序

mysql資料庫表的自增主鍵id號亂了,需要重新排列。原理 刪除原有的自增id,重新建立新的自增id。1,刪除原有主鍵 alter table table name drop id 2,新增新主鍵字段 alter table table name add id mediumint 8 not nul...