下面这几个小问题都是基于 InnoDB 存储引擎的。
1. ID最大的记录删除后,新插入的记录ID是什么
例如当前表中有ID为1,2,3三条记录,把3删除,新插入记录的ID从哪儿开始?
答案: 从4开始。
实验
创建表 tb0,ID自增:
create table tb0(id int unsigned auto_increment primary key); |
insert into tb0 values(null); |
delete from tb0 where id=3 |
show create table tb0; # 结果 CREATE TABLE `tb0` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |
create table tb1(id int unsigned auto_increment primary key); |
insert into tb1 values(null); |
delete from tb1 where id=3 |
show create table tb1; # 结果 CREATE TABLE `tb1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |
create table tb2(id int unsigned auto_increment primary key); |
insert into tb2 values(null); |
insert into tb2 values(4294967000); |
show create table tb2; # 结果 CREATE TABLE `tb2` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967001 DEFAULT CHARSET=latin1 |
Duplicate entry '4294967295' for key 'PRIMARY'
如果表记录经常插入、删除,即使表内记录总量不是很大,ID也可能快速用完,这种情况可以需要使用 bigint。
int 取值范围:
int 是 4 byte,首位用来表示符号
有符号的范围:
从 - 至 - 1(-2147483648 至 2147483647)
无符号的范围:
0 至 - 1(0 至 4294967295)
bigint 取值范围:
int 是 8 byte
有符号的范围:
从 - 至 - 1(-9223372036854775808 至 9223372036854775807)
无符号的范围:
0 至 - 1(0 至 18446744073709551615)
小结
通过实验可以发现InnoDB中自增ID的一些特性:
插入新记录时,就会计算出新的自增值(最大ID+1),不管是使用自动ID,还是手动指定一个ID。
删除最大ID值对自增ID值没有影响,但MySQL重启之后有影响,不会使用之前的自增ID值,而是使用最大ID+1,因为自增ID值是存在内存中,重启后需