目录
我在工作中经常会遇到有人问我,数据库表的ID是自增的,那么如果ID用完了会怎么样?说实话,我一直从事的是政企行业的开发,因为是传统行业,并且数据量基本上增长缓慢,所以到目前为止我还没遇到过自增ID用完的情况。因此我连夜做了实验,并编写了这篇文章将结果分享出来。在这里我会从两个方面来分享:有主键和无主键。(全文以MySQL为例,因为MySQL最常用)
一、有主键
在MySQL中int类型占4个字符,因为自增ID大部分都是以1开始,所以它的取值范围为1到2^32-1,也就是1到4294967295。首先我们创建一张表,并设置ID自增,且从2147483647开始。
Tip:2147483647是int类型主键的上线
CREATE TABLE `test1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `test` varchar(32) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2147483647 DEFAULT CHARSET=utf8mb4;
接着插入一条数据
insert into test1(test) values('hi');
我们再次插入一条数据,这时MySQL会提示错误:
1062 - Duplicate entry '2147483647' for key 'PRIMARY', Time: 0.000000s。
从这里得知,在有主键且主键自增的情况下,ID达到上限后MySQL会报错。
二、无主键
在MySQL中如果没有主键,InnoDB会为我们自动创建一个row_id,row_id为6字节并且最大长度为2^48-1。同理我们创建一张表:
CREATE TABLE `test2` ( `test` varchar(32) NOT NULL DEFAULT '' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
接着我们修改row_id为1,并插入5条数据
insert into test2(test) values('n1'); insert into test2(test) values('n2'); insert into test2(test) values('n3'); insert into test2(test) values('n4'); insert into test2(test) values('n5');
再次修改row_id为281474976710656,并再次插入数据:
insert into test2(test) values('n6'); insert into test2(test) values('n7'); insert into test2(test) values('n8');
最后我们查看所有数据,发现修改row_id为上限值钱的n1和n2被后来插入的n7和n8数据覆盖了,n6排在了所有数据的最前面。这是因为row_id达到上限后,再次插入数据的话row_id会重置为0,并覆盖前面的数据。