结论
结论如标题: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会自增,但不会连续