下面這幾個(gè)小問(wèn)題都是基于 InnoDB 存儲(chǔ)引擎的。
1. ID最大的記錄刪除后,新插入的記錄ID是什么
例如當(dāng)前表中有ID為1,2,3三條記錄,把3刪除,新插入記錄的ID從哪兒開(kāi)始?
答案: 從4開(kāi)始。
實(shí)驗(yàn)
創(chuàng)建表 tb0,ID自增:
create table tb0(id int unsigned auto_increment primary key);
插入3條記錄:
insert into tb0 values(null);
刪除ID為3的記錄:
delete from tb0 where id=3
查看當(dāng)前自增值:
show create table tb0;
# 結(jié)果
CREATE TABLE `tb0` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
自增ID為4,刪除ID最大的記錄并不影響自增ID的值。
2. MySQL 重啟后自增ID從哪兒開(kāi)始
例如當(dāng)前表中有ID為1,2,3三條記錄,把3刪除,重啟MySQL,新插入記錄的ID從哪兒開(kāi)始?
很多人會(huì)認(rèn)為從4開(kāi)始,實(shí)際是從3開(kāi)始。
因?yàn)镮nnoDB的自增值是記錄在內(nèi)存的,不是記錄在數(shù)據(jù)文件的。
重啟后,會(huì)把 當(dāng)前最大ID + 1 作為起始值。
實(shí)驗(yàn)
創(chuàng)建表 tb1,ID自增:
create table tb1(id int unsigned auto_increment primary key);
添加3條數(shù)據(jù)記錄:
insert into tb1 values(null);
刪除ID為3的記錄:
delete from tb1 where id=3
通過(guò)上一個(gè)問(wèn)題,我們知道,此時(shí)自增ID值為4。
重啟MySQL。
查看當(dāng)前的自增值:
show create table tb1;
# 結(jié)果
CREATE TABLE `tb1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
3. 手動(dòng)插入ID后,下次插入時(shí)自增值是多少
例如當(dāng)前的自增ID為4,新插入記錄時(shí),手動(dòng)指定ID為10,下次使用自增方式插入時(shí),ID是 11。
ID自增值 = 當(dāng)前最大ID + 1
在插入新記錄時(shí),就已經(jīng)計(jì)算得出了新的ID值
實(shí)驗(yàn)
創(chuàng)建表 tb2,ID自增:
create table tb2(id int unsigned auto_increment primary key);
添加記錄:
insert into tb2 values(null);
手動(dòng)指定ID:
insert into tb2 values(4294967000);
查看當(dāng)前的自增值:
show create table tb2;
# 結(jié)果
CREATE TABLE `tb2` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967001 DEFAULT CHARSET=latin1
可以看到自增值變?yōu)?4294967001。
4. 自增值用完后怎么辦
無(wú)符號(hào) int 的最大值為 4294967295,自增值達(dá)到此值后,就不變了,新插入記錄時(shí)就會(huì)報(bào)錯(cuò):
Duplicate entry '4294967295' for key 'PRIMARY'
如果表記錄經(jīng)常插入、刪除,即使表內(nèi)記錄總量不是很大,ID也可能快速用完,這種情況可以需要使用 bigint。
int 取值范圍:
int 是 4 byte,首位用來(lái)表示符號(hào)
有符號(hào)的范圍:
從 - 至 - 1
(-2147483648 至 2147483647)
無(wú)符號(hào)的范圍:
0 至 - 1
(0 至 4294967295)
bigint 取值范圍:
int 是 8 byte
有符號(hào)的范圍:
從 - 至 - 1
(-9223372036854775808 至 9223372036854775807)
無(wú)符號(hào)的范圍:
0 至 - 1
(0 至 18446744073709551615)
小結(jié)
通過(guò)實(shí)驗(yàn)可以發(fā)現(xiàn)InnoDB中自增ID的一些特性:
插入新記錄時(shí),就會(huì)計(jì)算出新的自增值(最大ID+1),不管是使用自動(dòng)ID,還是手動(dòng)指定一個(gè)ID。
刪除最大ID值對(duì)自增ID值沒(méi)有影響,但MySQL重啟之后有影響,不會(huì)使用之前的自增ID值,而是使用最大ID+1,因?yàn)樽栽鯥D值是存在內(nèi)存中,重啟后需要重新計(jì)算。
自增ID用完后就不變了。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- MySQL的自增ID(主鍵) 用完了的解決方法
- 關(guān)于mysql自增id,你需要知道的
- MySQL表自增id溢出的故障復(fù)盤解決
- 關(guān)于Mysql自增id的這些你可能還不知道
- mysql自增id超大問(wèn)題的排查與解決
- MySQL分表自增ID問(wèn)題的解決方法
- 線上MySQL的自增id用盡怎么辦