根本原因是还原脚本强行覆盖 auto_increment 初始值,导致新插入记录主键冲突;navicat 导出 sql 默认包含 auto_increment=n,还原时直接设为下一次插入起点,无视目标表实际最大 id。

根本原因不是数据重复,而是还原脚本强行覆盖了 AUTO_INCREMENT 初始值,导致下一次插入直接撞上已有记录。
导出 SQL 里硬写了 AUTO_INCREMENT = N
Navicat 默认导出的 CREATE TABLE 语句末尾会带上类似 ENGINE=InnoDB AUTO_INCREMENT=51110 的声明。还原时 MySQL 直接照搬这个值设为下一次插入起点——哪怕目标表当前最大 id 是 99999,它也会从 51110 开始分配,结果第 1 条新记录就报主键冲突。
- 检查方法:用文本编辑器打开导出的 SQL 文件,搜索
AUTO_INCREMENT=,看数值是否明显小于你预期的起始点(比如目标表已有 10 万条数据,但脚本写的是AUTO_INCREMENT=100) - 导出时规避:右键表 →「转储 SQL 文件」→「高级」选项卡 → 取消勾选
Include AUTO_INCREMENT value(中文版叫「包含 AUTO_INCREMENT 值」) - 已导出但未还原:手动删掉所有
CREATE TABLE语句末尾的AUTO_INCREMENT=xxx部分(保留字段定义里的AUTO_INCREMENT关键字即可)
结构同步向导也默认同步 AUTO_INCREMENT 值
结构同步(Structure Sync)向导默认把源表的 AUTO_INCREMENT 值当作 DDL 结构强制写入目标表,行为和导出脚本一致。这个开关藏在「高级」面板里,不点开就看不见,而且每次新建任务都得重设。
- 正确路径:结构同步向导 →「选项」页签 → 点右下角「高级」按钮 → 找到
AUTO_INCREMENT行 → 确保复选框未勾选 - 验证是否生效:勾选
Generate SQL only (do not execute)导出预览 SQL,搜索AUTO_INCREMENT=;若仍存在,说明没关对 - 注意:该设置不影响「数据同步」(Data Sync)任务,只作用于结构或结构+数据同步
还原后怎么紧急修复 AUTO_INCREMENT 值
如果已经还原出错,别删表重建。执行一条 ALTER TABLE 就能对齐,但必须在目标库操作,且不能硬写成 1。
- 先查当前最大值:
SELECT COALESCE(MAX(id), 0) FROM your_table; - 再设安全起点:
ALTER TABLE your_table AUTO_INCREMENT = <max_id>;</max_id>(例如ALTER TABLE users AUTO_INCREMENT = 100001;) - 执行前确认:目标表没被长事务锁住,否则
ALTER TABLE会阻塞
最易被忽略的一点:这个 AUTO_INCREMENT 值在跨平台同步(如 macOS → Linux)、空库初始化、或测试环境重建时最容易暴露问题——因为目标表往往数据量少甚至为空,而源库的自增值却很大,硬同步过去几乎必撞。











