Navicat无增量同步开关,需手动设置WHERE条件筛选新增/变更行;必须关闭“删除目标中不存在的记录”;同步类型选“插入和更新”并配置冲突处理为更新;主键不一致时需手动指定匹配字段;目标表须有主键或唯一索引;WHERE条件须填在高级选项中且用静态时间字符串。
navicat 本身没有“增量同步”开关,所谓增量,全靠你手动加 where 条件筛出新增或变更的行——不设条件,它默认全表比对,极易覆盖或中断。
必须关闭「删除目标中不存在的记录」
这是最常踩的坑:勾选了这个选项,源表里没出现的 ID,目标表里直接被 DELETE。哪怕你只想要新增数据,也会把历史数据清空。
- 在「同步设置 → 高级选项」里,确认该选项未勾选
- 如果目标表是汇总库、日志库或含人工补录数据,这一项绝对不能开
- 误开后同步完成发现少了几百条记录,基本就是它干的
同步类型选「插入和更新」,别用「仅插入」
仅插入 看似安全,实则丢更新:它遇到主键冲突就跳过,status 字段变了也不会同步过去。真正需要增量合并的场景(比如订单状态流转),必须选「插入和更新」。
- 「插入和更新」配合「冲突处理 → 更新现有记录」,才能让变更落地
- 如果源表用
UUID当主键,而目标表是AUTO_INCREMENT,Navicat 默认匹配失败——得进「表映射 → 匹配字段」手动指定业务键(如order_no) - 目标表若缺主键或唯一索引,Navicat 无法判断“是否已存在”,
INSERT可能报Duplicate entry '123' for key 'PRIMARY'后卡住
WHERE 条件必须填在「高级选项 → 设置同步条件」
这里填的不是装饰,而是真正控制拉哪些数据的 SQL 片段。Navicat 会在同步前用它过滤源表,而不是先拉全量再比对。
- 推荐写法:
created_at > '2026-07-26 00:00:00'(注意单引号、秒级精度) - 别写
NOW()或DATE_SUB(NOW(), INTERVAL 1 DAY)—— GUI 不解析函数,只认静态字符串 - 单靠
id > 98765风险高:ID 被归档、分表重用、或中间补数据,都会漏掉 - 更稳的做法是组合:
created_at > '2026-07-26 00:00:00' AND id > 98765
字段映射时小心「Ignore columns」和「Match fields by name」
这两个设置配反,会导致字段写错位置,比如把源表的 create_time 写进目标表的 update_time,表面同步成功,实际数据逻辑已乱。
-
Ignore columns是“不读取也不写入”,想保留目标表的updated_at不被覆盖,就得把它加进去 -
Match fields by name开启后自动按列名连线,但如果目标表多了一个is_synced字段,Navicat 可能把status连到它上面 - 结构不一致时,建议关掉自动匹配,手动拖拽确认每一列
真正难的不是点几下按钮,而是想清楚哪张表用什么字段做增量锚点、时间戳是否可靠、主键是否全局唯一、目标表有没有额外约束。这些细节没对齐,WHERE 写得再准也没用。


















