You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis-Plus中MySQL自增ID不连续问题原因咨询

MySQL自增ID不连续问题原因分析

场景回顾

你的业务场景:

  • 实体类SaledData的id字段通过@TableId(type = IdType.AUTO)设置为自增主键
  • recordDate字段带有唯一索引,定时任务插入数据时会因重复数据触发唯一键拦截
  • 最终数据库中出现ID不连续(如158之后直接到160)的情况

核心原因:唯一键冲突导致自增ID被占用未回收

MySQL的自增主键分配逻辑是先分配ID,再执行插入:

  1. 当执行insert语句时,MySQL会先根据表的AUTO_INCREMENT值分配一个新的自增ID,同时将AUTO_INCREMENT值+1
  2. 尝试插入数据时,由于recordDate的唯一索引约束,重复数据会触发唯一键冲突,导致插入失败、事务回滚
  3. 但已经分配出去的ID不会被回滚或回收,后续成功插入的记录会使用下一个AUTO_INCREMENT值对应的ID,自然就出现了ID断号的情况

其他可能的辅助原因

如果后续业务中存在以下操作,也可能导致或加剧ID不连续:

  • 数据库重启:MySQL的自增ID值存储在内存中,重启后会基于表中现有最大ID重新初始化AUTO_INCREMENT,若之前有未提交的事务分配过ID但回滚,重启后会跳过这些ID
  • 批量插入操作:若使用MyBatis-Plus的批量插入方法,MySQL会预分配一批自增ID,即使部分插入失败,未使用的ID也不会被回收
  • 手动指定ID插入:如果存在手动给id赋值并插入的操作,会打乱自增序列的连续性

内容的提问来源于stack exchange,提问作者Mark X

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:35:07