Mysql自增主键递增但不一定严格连续

Mysql自增主键在某些情况下虽然递增,但并不保证严格连续。通过测试发现,当insert语句在数据入库前已增加自增值,即使插入失败,自增值也不会回退,导致主键ID不连续。同时,Mysql在批量插入时可能采用主键ID批量申请策略,这也会影响ID的连续性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


结论

结论如标题:Mysql自增主键递增但不一定严格连续


一、Mysql版本

测试版本为:8.0.30

二、测试步骤

1、创建测试表

CREATE TABLE `test_table` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`a`  int(11) NULL ,
`b`  int(11) NULL ,
PRIMARY KEY (`id`),
UNIQUE INDEX `a` (`a`) USING BTREE 
);

2、插入数据

insert into test_table (a , b ) values (8,1);
insert into test_table (a , b ) values (8,1);
insert into test_table (a , b ) values (9,1);

连续执行这三条Sql语句(第二条insert 语句会报错),再对test_table
进行查询,此时会发现id不是严格递增的。
id a b
13 8 1
15 9 1


三、分析

insert 语句 在完成数据入库之前,已经将自增值加1,但insert语句数据入库报错后,并没有将自增值进行回退,所以造成了id不是严格递增的现象。


四、总结

1、为保证并发事务下自增id准确性,所以若自增id对应的数据未成功入库,该自增id数据不回退
2、在insert into tablea select * from tableb 的情况下, Mysql存在主键id批量申请策略。

语句执行过程中,第一次申请自增id,会分配1个;

1个用完以后,这个语句第二次申请自增id,会分配2个;

 2个用完以后,还是这个语句,第三次申请自增id,会分配4个;

依次类推,同一个语句去申请自增id,每次会申请到的自增id个数都是上一次的两倍。

因此,在这种批量申请自增id的情况下,id会自增,但不会连续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值