背景:
A表带自增键,B表不带,通过程序从A表同步数据到B表,同步完成后会通过delete删除A表数据,今天插入B表会出现duplicate primary key问题。
A:
select max(id) from A;
auto_increment id=58000;
B:
只有主键没有自增键
select id from B by id desc limit 10;
代码语言:txt复制 | id |
---------
| 1873741 |
| 1873739 |
| 1873737 |
| 1873735 |
| 1873733 |
| 1873731 |
| 1873729 |
发现B最大id是187000w,所以考虑修改A的自增列起始值,通过如下命令
alter table A auto_increment=2000000;
修改后起始值从200w开始。
接下来继续测试,DELETE,TRUNCATE 触发AUTO_INCREMENT的变化
代码语言:txt复制 **结论** :
delete 操作不会变更 AUTO_INCREMENT当前的顺序值
truncate 操作会导致AUTO_INCREMENT 从1开始,
代码语言:txt复制**主因**:
后来发现主要原因是所在实例重启造成的,auto_increment的自增值在mysql8.0之前一直是记录内存中的,
当实例重启的时候该值会丢失,那么mysql会取select max(id) 1 的值作为新插入数据的自增ID,
这样启动后就A表从58000开始而不是1873741开始,这样造成插入B表会重复
代码语言:txt复制