MyBatis-Plus中MySQL自增ID不连续问题原因咨询
MySQL自增ID不连续问题原因分析
场景回顾
你的业务场景:
- 实体类
SaledData的id字段通过@TableId(type = IdType.AUTO)设置为自增主键 recordDate字段带有唯一索引,定时任务插入数据时会因重复数据触发唯一键拦截- 最终数据库中出现ID不连续(如158之后直接到160)的情况
核心原因:唯一键冲突导致自增ID被占用未回收
MySQL的自增主键分配逻辑是先分配ID,再执行插入:
- 当执行
insert语句时,MySQL会先根据表的AUTO_INCREMENT值分配一个新的自增ID,同时将AUTO_INCREMENT值+1 - 尝试插入数据时,由于
recordDate的唯一索引约束,重复数据会触发唯一键冲突,导致插入失败、事务回滚 - 但已经分配出去的ID不会被回滚或回收,后续成功插入的记录会使用下一个
AUTO_INCREMENT值对应的ID,自然就出现了ID断号的情况
其他可能的辅助原因
如果后续业务中存在以下操作,也可能导致或加剧ID不连续:
- 数据库重启:MySQL的自增ID值存储在内存中,重启后会基于表中现有最大ID重新初始化
AUTO_INCREMENT,若之前有未提交的事务分配过ID但回滚,重启后会跳过这些ID - 批量插入操作:若使用MyBatis-Plus的批量插入方法,MySQL会预分配一批自增ID,即使部分插入失败,未使用的ID也不会被回收
- 手动指定ID插入:如果存在手动给
id赋值并插入的操作,会打乱自增序列的连续性
内容的提问来源于stack exchange,提问作者Mark X
相关产品推荐
相关产品推荐

