1. 程式人生 > 其它 >mysql 檢視設定自增id_面試被問MySQL 的自增 ID 用完了,怎麼辦?

mysql 檢視設定自增id_面試被問MySQL 的自增 ID 用完了,怎麼辦?

技術標籤:mysql 檢視設定自增id

MySQL的自增ID會用完嗎,話不多說,上程式碼,直接測: 首先,建立一個最簡單的表,只包含一個自增 id,並插入一條資料。
createtablet0(idintunsignedauto\_incrementprimarykey);insertintot0values(null);
通過 show 命令 show create table t0; 查看錶情況
CREATETABLE\`t0\`(\`id\`int(10)unsignedNOTNULLAUTO\_INCREMENT,PRIMARYKEY(\`id\`))ENGINE=InnoDBAUTO\_INCREMENT=2DEFAULTCHARSET=utf8
可以發現 AUTO_INCREMENT 已經自動變成 2,這離用完還有很遠,我們可以算下最大當前宣告的自增 ID 最大是多少,由於這裡定義的是 intunsigned ,所以最大可以達到 2 的 32 冪次方 - 1 = 4294967295 這裡有個小技巧,可以在建立表的時候,直接宣告 AUTO_INCREMENT 的初始值
createtablet1(idintunsignedauto\_incrementprimarykey)auto\_increment=4294967295;insertintot1values(null);
同樣,通過 show 命令,檢視 t1 的表結構
CREATETABLE\`t1\`(\`id\`int(10)unsignedNOTNULLAUTO\_INCREMENT,PRIMARYKEY(\`id\`))ENGINE=InnoDBAUTO\_INCREMENT=4294967295DEFAULTCHARSET=utf8
可以發現,AUTO_INCREMENT 已經變成 4294967295 了,當想再嘗試插入一條資料時,得到了下面的異常結果
17:28:03insertintot1values(null)ErrorCode:1062.Duplicateentry'4294967295'forkey'PRIMARY'0.00054sec
說明,當再次插入時,使用的自增 ID 還是 4294967295 ,報主鍵衝突的錯誤。 4294967295,這個數字已經可以應付大部分的場景了,如果你的服務會經常性的插入和刪除資料的話,還是存在用完的風險,建議採用 bigint unsigned,這個數字就大了。 不過,還存在另一種情況,如果在建立表沒有顯示申明主鍵,會怎麼辦?
如果是這種情況,InnoDB 會自動幫你建立一個不可見的、長度為 6 位元組的 row_id,而且 InnoDB 維護了一個全域性的 dictsys.row_id,所以未定義主鍵的表都共享該 row_id,每次插入一條資料,都把全域性 row_id 當成主鍵 id,然後全域性 row_id 加 1 該全域性 row_id 在程式碼實現上使用的是 bigint unsigned 型別,但實際上只給 row_id 留了 6 位元組,這種設計就會存在一個問題:如果全域性 row_id 一直漲,一直漲,直到 2 的 48 冪次 - 1 時,這個時候再 + 1,row_id 的低 48 位都為 0,結果在插入新一行資料時,拿到的 row_id 就為 0,存在主鍵衝突的可能性。 所以,為了避免這種隱患,每個表都需要定一個主鍵。

來源:程式猿面試指南

版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。祝願每一位讀者生活愉快!謝謝!

微信搜尋程式設計師面試

54e827e52c94ed4dbc7ac7f2384f1017.png

↑↑↑掃碼回覆程式設計師有彩蛋↑↑↑