MySQL表自增id用完了該怎么辦?

我們知道MySQL表可以定義一個自增長的id捏境,如果我們的表沒有指定主鍵字段于游,那MySQL會給我們的表創(chuàng)建一個不可見的,長度為6個自己的row_id垫言,然后不停地往上加步長贰剥,雖然生活中自然數(shù)是沒有上限的,但是在計算機里筷频,我們只要定義了表示這個數(shù)的字節(jié)長度蚌成,那么它就有上限前痘,比如在Java中,int類型的上限值為2^31-1担忧,即2147483647芹缔。MySQL無符號整數(shù)上限為2^32 -1,即4294967295

表的自增id用完了怎么辦

表定義的自增id達(dá)到了上線后瓶盛,再申請下一個id時最欠,得到的值保持不變。

驗證一下:

CREATE TABLE `user` (

? `id` int(20) unsigned NOT NULL AUTO_INCREMENT,

? `name` varchar(10) DEFAULT NULL,

? PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8;

上面創(chuàng)建了一張user表惩猫,id為自增主鍵芝硬,并且我們把AUTO_INCREMENT設(shè)置成了4294967295,也就是說下次執(zhí)行insert語句的時候id為并且我們把AUTO_INCREMENT設(shè)置成了4294967295:

INSERT INTO `test`.`user` (`name`) VALUES ('張三');

結(jié)果如圖:

同樣我們再執(zhí)行一次insert語句就會報主鍵沖突異常:

MySQL InnoDB系統(tǒng)自增row_id用完了怎么辦

如果我們創(chuàng)建的表沒有指定主鍵轧房,那MySQL會給我們指定一個row_id作為主鍵拌阴。InnoDB維護(hù)了一個全局的dict_sys.row_id值,所有沒有主鍵的InnoDB表奶镶,在每次插入一行數(shù)據(jù)時迟赃,都會將當(dāng)前的dict_sys.row_id值作為要插入數(shù)據(jù)的row_id,然后dict_sys.row_id的值加1厂镇。row_id占用6個字節(jié)長度纤壁,所以row_id也是有范圍的,即row_id值的范圍是從0到2^48(無符號)剪撬。和MySQL自增id不同的是摄乒,如果row_id達(dá)到了上限,下一次取值就從0開始残黑,然后繼續(xù)循環(huán)。如果插入一條數(shù)據(jù)時申請到的row_id比如是0斋否,如果表中沒有row_id為0的數(shù)據(jù)則直接將數(shù)據(jù)插入到表中梨水,但如果表中已經(jīng)有row_id為0的數(shù)據(jù),再插入時就會覆蓋掉原來的數(shù)據(jù)茵臭。

驗證一下:

創(chuàng)建一張沒有主鍵的表:

CREATE TABLE `use_row_id` (

? `name` varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后依次執(zhí)行以下語句:

gdb -p 5132 -ex 'p dict_sys.row_id=1' --batch

INSERT INTO `test`.`use_row_id` (`name`) VALUES ('張三');

gdb -p 5132 -ex 'p dict_sys.row_id=281474976710656' --batch

INSERT INTO `test`.`use_row_id` (`name`) VALUES ('李四');

INSERT INTO `test`.`use_row_id` (`name`) VALUES ('王五');

結(jié)果如圖:

從圖中可以看到原來的張三那條數(shù)據(jù)已經(jīng)被覆蓋了疫诽。

總結(jié)

MySQL自增id用完后,再次申請id旦委,得到的值保持不變奇徒。插入數(shù)據(jù)會報主鍵沖突異常。

MySQL InnoDB表未指定主鍵時缨硝,MySQL會指定一個row_id摩钙,如果row_id用完了,則會從頭開始循環(huán)查辩。從這點來說還是建議我們創(chuàng)建表的時候指定主鍵的胖笛,畢竟使用row_id會發(fā)生覆蓋數(shù)據(jù)网持,導(dǎo)致原來的數(shù)據(jù)丟失,影響數(shù)據(jù)的可靠性长踊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末功舀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子身弊,更是在濱河造成了極大的恐慌辟汰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阱佛,死亡現(xiàn)場離奇詭異帖汞,居然都是意外死亡,警方通過查閱死者的電腦和手機瘫絮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門涨冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人麦萤,你說我怎么就攤上這事鹿鳖。” “怎么了壮莹?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵翅帜,是天一觀的道長。 經(jīng)常有香客問我命满,道長涝滴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任胶台,我火速辦了婚禮歼疮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诈唬。我一直安慰自己韩脏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布铸磅。 她就那樣靜靜地躺著赡矢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阅仔。 梳的紋絲不亂的頭發(fā)上吹散,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音八酒,去河邊找鬼空民。 笑死,一個胖子當(dāng)著我的面吹牛丘跌,可吹牛的內(nèi)容都是我干的袭景。 我是一名探鬼主播唁桩,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耸棒!你這毒婦竟也來了荒澡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤与殃,失蹤者是張志新(化名)和其女友劉穎单山,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幅疼,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡米奸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爽篷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悴晰。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逐工,靈堂內(nèi)的尸體忽然破棺而出铡溪,到底是詐尸還是另有隱情,我是刑警寧澤泪喊,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布棕硫,位于F島的核電站,受9級特大地震影響袒啼,放射性物質(zhì)發(fā)生泄漏哈扮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一蚓再、第九天 我趴在偏房一處隱蔽的房頂上張望滑肉。 院中可真熱鬧,春花似錦摘仅、人聲如沸赦邻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至按声,卻和暖如春膳犹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背签则。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工须床, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渐裂。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓豺旬,卻偏偏與公主長得像钠惩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子族阅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355