Navicat 16数据同步的WHERE条件需在「表映射」页签中点击某表右侧Options→勾选Use WHERE condition后输入,而非高级选项;该处控制实际拉取范围,示例:created_at > '2026-04-20 00:00:00'。
navicat 16 的「数据同步」工具本身不自动识别增量,必须手动加 where 条件才能只导出新增或变更的数据;不配置就点同步,等于全表比对+覆盖,极易重复插入或误删。
在哪填 WHERE 条件?不是“高级选项”,是表映射页的过滤框
很多人在「高级选项」里翻半天没找到入口,其实关键位置在:同步向导 → 「表映射」页签 → 点开某张表右侧的 Options → 勾选 Use WHERE condition → 在下方输入框里写条件。这里才是真正控制数据范围的地方。
- 错误做法:在「高级」→「设置同步条件」里填,那个入口只影响比对逻辑,不参与实际数据拉取
- 正确写法示例:
created_at > '2026-04-20 00:00:00'或id > 150000(注意单引号不能少) - 如果用变量,MySQL 可写
created_at > DATE_SUB(NOW(), INTERVAL 1 DAY);PostgreSQL 得换为created_at > NOW() - INTERVAL '1 day' - 别用
BETWEEN,秒级数据容易漏掉边界记录;用>+ 明确时间点更稳
“仅插入”和“插入和更新”怎么选?取决于目标表有没有主键冲突
这个选择直接决定 Navicat 遇到已存在主键时的行为——它不会自动判断“该插还是该更”,全靠你提前选好策略。
- 选
Insert records only:源数据里 id=123 的行,若目标表已有 id=123,Navicat 直接跳过,不报错也不更新 - 选
Insert and update records:同样 id=123,Navicat 会执行INSERT ... ON DUPLICATE KEY UPDATE(MySQL)或等效语句,覆盖目标字段 - 如果目标表没主键/唯一索引,两个选项效果一样,都会尝试插入,大概率报
Duplicate entry - 日常增量场景推荐选后者,并进「高级选项」→「冲突处理」设为
Update existing records
为什么同步后数据没变,或者字段写错了?匹配字段和忽略列配反了
Navicat 默认按列名自动连线(Match fields by name),但一旦源/目标表结构不对齐,比如目标多一个 is_synced 字段,它可能把 status 错连过去,导致数据错位。
- 务必检查「字段映射」界面右上角是否勾选了
Match fields by name;如果不一致,建议取消,手动拖拽确认每一对 -
Ignore columns不是“不读”,而是“不比对也不写入”;比如想保留目标表的updated_at不被源覆盖,必须把它加进 ignore 列表 - 常见错误现象:
source.created_at被写进了target.updated_at,基本就是匹配字段没核对清楚 - 如果源是 UUID 主键、目标是自增 ID,Navicat 无法自动识别同一行,得手动指定业务字段(如
order_no)作为匹配依据
最易被忽略的是时区——源库用 UTC 写 created_at,Navicat 客户端设成 CST,NOW() 就差 8 小时,条件一写就漏数据;每次同步前,先在两个库分别执行 SELECT NOW(), @@time_zone 对一遍。


















