同步后自增id跳号本质是auto_increment被硬覆盖,正确做法是先查max(id)再设为该值+1,结构同步时须关闭include auto_increment value选项。

同步后自增ID跳号,本质是AUTO_INCREMENT被硬覆盖
Navicat结构同步或SQL还原时,默认把源库的AUTO_INCREMENT=12345直接写进目标表DDL,不管目标表当前最大id是多少。一旦这个值小于已有数据的最大id,下一次插入就立刻报Duplicate entry 'x' for key 'PRIMARY'——这不是跳号,是冲突预警。
重置前必须查清目标表真实最大ID
别凭感觉填1,也别直接ALTER TABLE t AUTO_INCREMENT = 1。MySQL会静默忽略该语句(如果1 ≤ 当前最大id)。正确做法是先确认现状:
- 执行
SELECT IFNULL(MAX(id), 0) FROM your_table;,记下结果(比如返回99999) - 再执行
ALTER TABLE your_table AUTO_INCREMENT = 100000;(即MAX(id) + 1) - 括号不能少:
ALTER TABLE t AUTO_INCREMENT = (SELECT IFNULL(MAX(id), 0) + 1 FROM t);可避免空表时报错
同步时就该关掉AUTO_INCREMENT同步开关
这个坑90%的人踩过两次以上:每次新建结构同步任务,都得手动点开「高级」面板,取消勾选Include AUTO_INCREMENT value。它默认开启、不记忆、不按连接保存偏好。
- 路径:结构同步向导 → 「选项」页签 → 右下角「高级」→ 找到
AUTO_INCREMENT行 → 取消勾选 - 验证是否生效:勾选
Generate SQL only (do not execute)预览,搜索AUTO_INCREMENT=,若不存在才算成功 - 注意:
Data Sync(数据同步)不涉及此设置,它只管行内容,不管自增起点
TRUNCATE不是万能解,但空表时它最干净
如果目标表确实为空,TRUNCATE TABLE your_table比ALTER TABLE ... AUTO_INCREMENT = 1更可靠——它强制归零且无需判断逻辑。但有外键约束时会失败,此时只能走DELETE + ALTER组合。
-
DELETE FROM your_table;→ 不重置计数器 -
ALTER TABLE your_table AUTO_INCREMENT = 1;→ 仅当表空才生效;否则被忽略 - 真正安全的“清空+重置”两步法:
DELETE FROM t;→ALTER TABLE t AUTO_INCREMENT = (SELECT IFNULL(MAX(id), 0) + 1 FROM t);
最易被忽略的一点:MySQL 8.0+ 默认innodb_autoinc_lock_mode = 2,即使你正确重置了AUTO_INCREMENT,后续批量插入的ID分配顺序在不同环境也可能不一致——这不是Navicat的问题,但会影响你对“连续性”的预期。











