Navicat“仅插入”模式依赖目标表主键或唯一索引判断重复,缺则静默跳过或报错;需手动指定复合唯一索引字段、在表映射中配置WHERE过滤条件、冲突处理设为“跳过”且禁用删除选项,并确保字段映射与时区一致。
目标表没主键或唯一索引,仅插入会失效
navicat 的 仅插入 模式不是无脑追加,它依赖目标表存在明确的主键或唯一索引才能判断“是否已存在”。如果目标表执行 show create table table_name 后没看到 primary key 或 unique key,navicat 就无法比对,轻则静默跳过大量行,重则报 duplicate entry '123' for key 'primary' 中断任务。
复合唯一索引(如 (user_id, action_type))也能用,但必须在 Navicat「表映射 → 键映射」里手动指定这些字段为匹配依据,否则它认不出来。
常见错误现象:同步日志显示 “completed”,但目标行数远少于源表——大概率是目标表缺主键,Navicat 放弃比对直接批量跳过。
过滤条件必须写在「表映射」页的 过滤条件 框里
很多人以为勾了 仅插入 就自动增量,其实不是。Navicat 默认仍全表扫描源数据;不加 WHERE,它会把源库所有行都拉出来逐个比对,效率低还容易锁表。
真正控制“只拉新增”的,是你在「同步设置 → 表映射 → 点某表右侧 Options → 勾选 Use WHERE condition → 输入框」里填的语句:
-
created_at > '2026-07-20 00:00:00'(推荐,带秒更稳) -
id > 150000(前提是自增、单调、无归档重用) -
created_at > '2026-07-20 00:00:00' AND id > 150000(双保险防边界漂移)
注意:NOW()、DATE_SUB(NOW(), INTERVAL 1 DAY) 这类函数 GUI 不支持运行时解析,只认静态字符串;BETWEEN 容易漏掉边界秒级数据,别用。
冲突处理 必须设为 跳过,且关闭 删除目标中不存在的记录
即使选了 仅插入,如果误勾了 删除目标中不存在的记录,Navicat 会在同步前先执行 DELETE —— 这和“只插新”完全相悖,历史数据会被清空。这个选项默认常为启用状态,每次新建任务都要手动取消。
冲突处理 必须进「高级选项 → 冲突处理」明确选 跳过,不能选 更新现有记录(违背“不更新”前提)或 停止(一遇主键冲突就中断)。
如果同步中途报 Duplicate entry 并停住,不是 Navicat bug,而是你没提前告诉它“遇到重复,跳过就行”。
字段映射和时区不一致,会导致数据错位或漏同步
Navicat 默认按列名自动连线(Match fields by name),但如果源/目标表结构不对齐(比如目标多一个 is_synced 字段),它可能把 status 错连到 is_synced,导致数据写错位置。
时间字段务必确认时区一致:源库是 UTC,Navicat 客户端设为 CST?那 created_at > '2026-07-20' 就会漏掉 8 小时数据。建议统一用 UTC 时间字符串硬编码,或确保客户端与数据库时区一致。
Ignore columns 不是“不读取”,而是“不参与比对也不写入”;想保留目标表的 updated_at 不被覆盖,就得把它加进 ignore 列表。











