必须在结构同步向导「高级」页取消勾选auto_increment,否则目标表自增值被强制覆盖为源表值,导致新插入记录时因主键重复报错duplicate entry 'x' for key 'primary'。
必须在结构同步向导的「高级」页取消勾选 auto_increment,否则目标表自增值会被强制覆盖为源表当前值,插入新记录时立刻报 duplicate entry 'x' for key 'primary'。
同步前不关 AUTO_INCREMENT 会怎样
Navicat 默认把源表 CREATE TABLE 语句中显式的 AUTO_INCREMENT = 12345 当作结构一部分写入目标表。哪怕目标表已有 99999 条数据、最大 id 是 99999,同步后它的 AUTO_INCREMENT 也会变成 12345。下一次 INSERT 就直接撞上已存在的 id。
- 该行为在 Navicat 16+ 全系列一致,不是 bug,但后果严重
-
数据同步任务不会触发此问题,只有结构同步或结构+数据才会 - MySQL 8.0+ 的
innodb_autoinc_lock_mode = 2会让断层更难预测
正确关闭 AUTO_INCREMENT 同步的路径
这个开关藏得深,且每次新建同步任务都得重设——它不保存为全局偏好。
- 打开结构同步向导 → 走到「选项」页签 → 点右下角「高级」按钮
- 在弹出面板中找到
AUTO_INCREMENT(或英文名Include AUTO_INCREMENT value) - 确保其复选框未勾选(默认是勾选的)
- 同理,若不想同步
COMMENT或ENGINE,也在同一位置取消
已经同步完且出错了怎么办
别删表重建。用一条 ALTER TABLE 把自增值设回安全位置即可,但必须在目标库执行。
- 先查目标表当前最大
id:SELECT COALESCE(MAX(id), 0) FROM your_table; - 再执行:
ALTER TABLE your_table AUTO_INCREMENT = <max_id>;</max_id>(例如ALTER TABLE users AUTO_INCREMENT = 100001;) - 避免硬写
AUTO_INCREMENT = 1,除非你确认表完全为空 - 执行前确认目标表没被长事务锁住,否则
ALTER TABLE会卡住
验证是否真关掉了
Navicat 界面的「预览」有时不显示 AUTO_INCREMENT 变更,最可靠的方式是导出 SQL 再检查。
- 同步前勾选
Generate SQL only (do not execute) - 导出后搜索
AUTO_INCREMENT=,如果出现类似AUTO_INCREMENT=892就说明没关对 - 正常情况是字段定义里有
id INT NOT NULL AUTO_INCREMENT,但末尾不带等号赋值
真正麻烦的不是操作本身,而是那个默认开启的 AUTO_INCREMENT 开关——它安静地待在「高级」面板里,不点开就看不见,一错就是主键冲突,而且错误信息里完全不提这个原因。











