造成自增id不连续的情况可能有:
1.唯一键冲突
2.事务回滚
3.insert ... select语句批量申请自增id
3.自增id有上限吗?
自增id是整型字段,我们常用int类型来定义增长id,而int类型有上限 即增长id也是有上限的。
下表列举下 int 与 bigint 字段类型的范围:
类型 | 大小 | 范围(有符号) | 范围(无符号) |
---|---|---|---|
int | 4字节 | (-2147483648,2147483647) | (0,4294967295) |
bigint | 8字节 | (-9223372036854775808,9223372036854775807) | (0,18446744073709551615) |
从上表可以看出:当自增字段使用int有符号类型时,最大可达2147483647即21亿多;使用int无符号类型时,最大可达4294967295即42亿多。当然bigint能表示的范围更大。
下面我们测试下当自增id达到最大时再次插入数据会怎么样:
create table t(id int unsigned auto_increment primary key) auto_increment=4294967295; insert into t values(null); // 成功插入一行 4294967295 show create table t; /* CREATE TABLE `t` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967295; */ insert into t values(null); //Duplicate entry '4294967295' for key 'PRIMARY'
从实验可以看出,当自增id达到最大时将无法扩展,第一个 insert 语句插入数据成功后,这个表的AUTO_INCREMENT 没有改变(还是 4294967295),就导致了第二个 insert 语句又拿到相同的自增 id 值,再试图执行插入语句,报主键冲突错误。
4.关于自增列 我们该怎么维护?
维护方面主要提供以下2点建议:
1.字段类型选择方面:推荐使用int无符号类型,若可预测该表数据量将非常大 可改用bigint无符号类型。
2.多关注大表的自增值,防止发生主键溢出情况。
总结
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com