vlambda博客
学习文章列表

MySQL自增主键用完了咋整

等你点关注都等的长毛了

不知道你在使用MySQL的时候有没有想过这个问题:MySQL自增主键会用完吗?如果用完了,会发生什么事?

我们先来看下在MySQL中,int和bigint两种类型的值域是多少:



类型
最小值 最大值 字节数
int(有符号)
-2^31
2^31
4
int(无符号)
0
2^32
4
bigint(有符号)
-2^63
2^63
8
bigint(无符号)
0
2^64
8

当我们使用int(有符号)类型的时候,创建一张表:

create table test_ai ( id int(10) auto_increment primary key, name varchar(11) not null) engine=InnoDB;

执行两条SQL语句:

insert test_ai(id, name) values(2147483646, 'cc1');insert test_ai(name) values('cc2');insert test_ai(name) values('cc3');

当执行到第三句SQL的时候就会报错Duplicate entry '2147483647' for key 'PRIMARY',也就是说当我们的自增主键用完之后,就无法继续往表中新增数据了


解决办法


我们在正常情况下,不会让单表存储那么大的数据量,所以一般不会出现这个问题,如果真的脑抽抽的在一张表中存储那么多数据,或者当数据迁移的时候造成了自增主键混乱,那么我们可以使用bigint(无符号)类型作为自增主键。

使用bigint(无符号)类型时,如果我们每秒插入1W条数据,不间断的跑100年,单表的数据量为:10000 * 3600 * 24 * 365 * 100 = 31536000000000,还远远小于2^64,完全不会被用完,如果操作正确的话。



点击 “在看” 解锁更多!