午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術文章
文章詳情頁

MySQL的自增ID(主鍵) 用完了的解決方法

瀏覽:99日期:2023-10-11 14:04:58

在 MySQL 中用很多類型的自增 ID,每個自增 ID 都設置了初始值。一般情況下初始值都是從 0 開始,然后按照一定的步長增加(一般是自增 1)。一般情況下,我們都是用int(11)來作為數據表的自增 ID,在 MySQL 中只要定義了這個數的字節長度,那么就會有上限。

MySQL的自增ID(主鍵) 用完了,怎么辦?

如果用 int unsigned (int,4個字節 ), 我們可以算下最大當前聲明的自增ID最大是多少,由于這里定義的是 int unsigned,所以最大可以達到2的32冪次方 - 1 = 4294967295。

這里有個小技巧,可以在創建表的時候,直接聲明AUTO_INCREMENT的初始值為4294967295。

create table `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295;

SQL插入語句

insert into `test` values (null);

當想再嘗試插入一條數據時,得到了下面的異常結果。

[SQL] insert into `test` values (null);[Err] 1062 - Duplicate entry ’4294967295’ for key ’PRIMARY’

說明,當再次插入時,使用的自增ID還是 4294967295,報主鍵沖突的錯誤,這說明 ID 值達到上限之后,就不會再變化了。4294967295,這個數字已經可以應付大部分的場景了,如果你的服務會經常性的插入和刪除數據的話,還是存在用完的風險,建議采用 bigint unsigned ,這個數字就大了。

bigint unsigned 的范圍是 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數據(所有數字), 存儲大小為 8 個字節。

不過,還存在另一種情況,如果在創建表沒有顯示申明主鍵,會怎么辦?

如果是這種情況,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,存在主鍵沖突的可能性。

所以,為了避免這種隱患,每個表都需要定一個主鍵。

總結

數據庫表的自增 ID 達到上限之后,再申請時它的值就不會在改變了,繼續插入數據時會導致報主鍵沖突錯誤。因此在設計數據表時,盡量根據業務需求來選擇合適的字段類型。

以上就是MySQL的自增ID(主鍵) 用完了的解決方法的詳細內容,更多關于MySQL 自增ID(主鍵)的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 免费看毛片的网站 | 白浆网站 | 欧产日产国产69 | 亚洲一区二区三区精品视频 | 亚洲国产第一页 | 美女啪啪网站 | 青青草视频网 | 国产精品成人一区二区 | 中文字幕色哟哟 | 大地6在线影院 | 久久久亚洲一区 | 卡通动漫亚洲 | 一区二区精品视频 | 影音先锋中文字幕在线视频 | 妹妹的朋友在线 | 三级国产视频 | 国产喷水在线观看 | 欧美精品999 | 大地资源第二页在线观看高清版 | 亚洲色综合 | 欧美成人高清在线 | 91大奶 | 国产精品色片 | 国产一区二区三区四区视频 | 亚洲色图日本 | 九九热这里有精品 | 国产午夜亚洲精品午夜鲁丝片 | 久久精品福利视频 | av在线视 | 亚洲ab| 校园春色第一页 | 99在线看 | 免费成人91 | 国产高清一区 | 中国黄色a级片 | 真实的国产乱xxxx在线 | 久久精品国产亚洲 | 亚洲免费高清 | 一二三四区在线 | 欧亚一区二区 | 污污视频在线观看免费 |