溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL的自增ID用完了怎么辦

發(fā)布時(shí)間:2021-09-16 07:14:47 來源:億速云 閱讀:110 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“MySQL的自增ID用完了怎么辦”,在日常操作中,相信很多人在MySQL的自增ID用完了怎么辦問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL的自增ID用完了怎么辦”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

既然這塊知識點(diǎn)不清楚,那回頭就自己動(dòng)手實(shí)踐下。

首先,創(chuàng)建一個(gè)最簡單的表,只包含一個(gè)自增id,并插入一條數(shù)據(jù)。

create table t0(id int unsigned auto_increment primary key) ;insert into t0 values(null);
 

通過show命令 show create table t0; 查看表情況

CREATE TABLE `t0` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
 

可以發(fā)現(xiàn) AUTO_INCREMENT 已經(jīng)自動(dòng)變成2,這離用完還有很遠(yuǎn),我們可以算下最大當(dāng)前聲明的自增ID最大是多少,由于這里定義的是 intunsigned,所以最大可以達(dá)到2的32冪次方 - 1 = 4294967295

這里有個(gè)小技巧,可以在創(chuàng)建表的時(shí)候,直接聲明AUTO_INCREMENT的初始值

create table t1(id int unsigned auto_increment primary key)  auto_increment = 4294967295;insert into t1 values(null);
 

同樣,通過show命令,查看t1的表結(jié)構(gòu)

CREATE TABLE `t1` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8
 

可以發(fā)現(xiàn),AUTO_INCREMENT已經(jīng)變成4294967295了,當(dāng)想再嘗試插入一條數(shù)據(jù)時(shí),得到了下面的異常結(jié)果

17:28:03    insert into t1 values(null) Error Code: 1062. Duplicate entry '4294967295' for key 'PRIMARY'    0.00054 sec
 

明,當(dāng)再次插入時(shí),使用的自增ID還是 4294967295,報(bào)主鍵沖突的錯(cuò)誤。

4294967295,這個(gè)數(shù)字已經(jīng)可以應(yīng)付大部分的場景了,如果你的服務(wù)會經(jīng)常性的插入和刪除數(shù)據(jù)的話,還是存在用完的風(fēng)險(xiǎn),建議采用bigint unsigned,這個(gè)數(shù)字就大了。

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

如果是這種情況,InnoDB會自動(dòng)幫你創(chuàng)建一個(gè)不可見的、長度為6字節(jié)的row_id,而且InnoDB 維護(hù)了一個(gè)全局的 dictsys.row_id,所以未定義主鍵的表都共享該row_id,每次插入一條數(shù)據(jù),都把全局row_id當(dāng)成主鍵id,然后全局row_id加1

該全局row_id在代碼實(shí)現(xiàn)上使用的是bigint unsigned類型,但實(shí)際上只給row_id留了6字節(jié),這種設(shè)計(jì)就會存在一個(gè)問題:如果全局row_id一直漲,一直漲,直到2的48冪次-1時(shí),這個(gè)時(shí)候再+1,row_id的低48位都為0,結(jié)果在插入新一行數(shù)據(jù)時(shí),拿到的row_id就為0,存在主鍵沖突的可能性。

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


到此,關(guān)于“MySQL的自增ID用完了怎么辦”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI