Navicat结构同步时自增ID被重置的典型表现是目标表AUTO_INCREMENT值变为1或远小于源表,导致插入新记录时主键冲突或跳号;根本原因是默认开启“Include AUTO_INCREMENT value”选项,将源表当前值硬写入目标表定义,需在同步向导高级设置中手动关闭该选项。
Navicat结构同步时自增ID被重置的典型表现
结构同步后,目标表的 auto_increment 值变成 1 或远小于源表,插入新记录时主键冲突或跳号。这不是数据丢失,而是 navicat 默认把 create table 语句中的 auto_increment=xxx 当作“初始值”直接写入目标库,没做增量校验。
同步前必须手动关闭“自动递增值”选项
这个开关藏得深,且不同版本位置略有差异:在同步向导第 2 步(“选择要同步的对象”)后,点右下角 “高级” 按钮 → 取消勾选 Include AUTO_INCREMENT value(有些旧版叫 Sync auto increment value)。不关它,Navicat 就会强行把源表当前 AUTO_INCREMENT 值写死到目标表定义里。
- 该选项默认是开启的,绝大多数人同步完才发现 ID 乱了
- 关闭后,Navicat 生成的
CREATE TABLE语句里不会带AUTO_INCREMENT=12345 - 目标表建好后,其
AUTO_INCREMENT值由 MySQL 自行根据现有最大主键推算(通常 +1),这才是安全行为
目标表已存在时,仅靠结构同步无法修复自增值
如果目标表已经建好、且 AUTO_INCREMENT 被错误设为 1,结构同步本身不会去改它——因为同步操作只对比表结构(字段、索引、注释等),不对比表元数据里的自增计数器。
- 必须手动执行
ALTER TABLE table_name AUTO_INCREMENT = N设置正确值 - N 应取源表当前最大主键 + 1,可用
SELECT MAX(id) FROM table_name查 - 注意:若表有外键约束或正在被写入,
ALTER TABLE可能锁表,建议低峰期操作
用命令行验证比依赖 Navicat 界面更可靠
Navicat 的“结构同步预览”有时不显示 AUTO_INCREMENT 相关变更,界面看起来干净,实际执行时仍可能写入。最稳妥的方式是导出同步生成的 SQL,肉眼检查是否含 AUTO_INCREMENT=。
- 同步前勾选
Generate SQL only (do not execute) - 导出后搜索
AUTO_INCREMENT,确认没有硬编码值 - 若发现类似
id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',是正常的;若出现AUTO_INCREMENT=892就说明高级选项没关对
Duplicate entry '1' for key 'PRIMARY' —— 很多人卡在这里反复重试,其实就差关掉那个隐藏开关。










