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(有符号)类型的时候,创建一张表:

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

执行两条SQL语句:

1
2
3
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,完全不会被用完,如果操作正确的话。