根本原因是navicat结构同步默认硬编码源表auto_increment值,强制覆盖目标表自增起点;需在同步向导「选项→高级」中取消勾选include auto_increment value,并同步后执行alter table auto_increment = max(id)+1修正。

Navicat 同步自增列导致主键重复错误,根本不是数据本身重复,而是它把源表的 AUTO_INCREMENT=12345 硬塞进目标表,不管目标表当前最大 id 是 99999 还是空——下一条 INSERT 就撞上已有记录。
同步前必须关掉 Include AUTO_INCREMENT value
这个选项默认勾选,且每次新建结构同步任务都要手动关,不点开「高级」就看不见。
- 路径:结构同步向导 → 「选项」页签 → 右下角「高级」按钮 → 找到
Include AUTO_INCREMENT value→ 取消勾选 - 验证是否生效:勾选
Generate SQL only (do not execute),预览 SQL,搜索AUTO_INCREMENT=;若仍存在,说明没关对 - 注意:该设置不影响「数据同步」任务,只作用于结构或结构+数据同步
同步后立即执行 ALTER TABLE 重置起点
即使关了选项,旧版本 Navicat 或某些边界场景(如目标表为空)仍可能漏控。同步完成后必须补这一步,否则新插入必报 Duplicate entry '1' for key 'PRIMARY'。
- 先查当前最大值:
SELECT COALESCE(MAX(id), 0) FROM your_table; - 再设安全起点:
ALTER TABLE your_table AUTO_INCREMENT = 100001;(把 100001 换成上一步结果 + 1) - 执行前确认:目标表没被长事务锁住,否则
ALTER TABLE会卡住;若表为空,TRUNCATE TABLE更快且自动归零
别信“跳过重复记录”对 SQL Server 生效
Navicat 15+ 的「跳过重复记录」在 SQL Server 导入中是灰色且无效的——SQL Server 没有 INSERT IGNORE 语义,Navicat 底层用的是 JDBC 默认事务行为,一错即停。
- 真正能用的只有「更新」模式:导入向导第 2 步 → 目标表映射 → 操作改为
Update→ 手动勾选主键列为「匹配」条件 - 若主键非单列(如联合唯一约束),Navicat 不支持,需提前在 SQL Server 中建视图或计算列收口逻辑
- 大数据量时,
Update模式会拆成逐行MERGE,性能明显下降,单次控制在 5 万行以内
最容易被忽略的底层陷阱
MySQL 8.0+ 默认的 innodb_autoinc_lock_mode = 2(交错模式)会让同样 SQL 在不同环境插入出不同 ID 序列——这不是 Navicat 的锅,但你得知道它存在。同步后即使 AUTO_INCREMENT 值对了,批量插入行为仍可能不一致。











