MariaDB插入null id触发自增时偶发主键重复错误问题咨询
自增主键偶发重复报错问题分析
触发场景
- InnoDB 自增计数器非持久化特性:MariaDB 10.1 分支继承自 MySQL 5.6 内核,InnoDB 自增计数器仅存储在内存中,未持久化到磁盘。数据库重启后会自动取表内最大
id+1 作为新的自增起始值,若此前存在手动指定大id插入、删除最新批次记录的操作,重启后计算的自增起始值可能与已存在的id冲突。 - 版本已知 Bug:MariaDB 10.1.35 存在并发插入场景下自增 ID 重复分配的 Bug,触发条件为插入操作因唯一键约束、外键约束失败回滚时,自增计数器未正确推进,下一次插入会尝试分配已被占用的 ID,与重试即可成功的现象完全吻合——第一次分配失败后计数器被异常推进,第二次分配的为可用新 ID。
- 显式指定 ID 操作共存:若业务存在其他代码路径手动为
id字段赋值插入,而非统一传null触发自增,可能出现手动插入的 ID 刚好等于下一个待分配的自增 ID,导致自动插入的请求报主键冲突。
修复方案
- 优先升级 MariaDB 到 10.1 最新小版本,或直接升级到 10.2 及以上稳定版本,该自增分配 Bug 已在后续版本修复。
- 排查所有业务插入逻辑,确认无手动指定
id字段值的操作,避免手动插入占用自增序列 ID。 - 若暂无法升级,每次调整自增起始值时,执行
ALTER TABLE Account AUTO_INCREMENT = [当前最大id+100];预留缓冲区间,降低计数器回退导致的冲突概率。 - 定期执行校验:对比
SELECT MAX(id) FROM Account;和SHOW CREATE TABLE Account;返回的AUTO_INCREMENT值,确保后者始终大于前者。
内容的提问来源于stack exchange,提问作者hessodreamy
相关产品推荐
相关产品推荐

