取消勾选源字段即设为Ignore columns,表示不读取、不比对、不写入;若目标列NOT NULL且无默认值,忽略会导致报错或NULL填充。

字段映射里取消勾选源字段,不是“跳过”而是“忽略写入”
Navicat 数据同步不会自动跳过你不想动的字段——它默认把所有同名字段都拉进映射。所谓“过滤掉”,实际是手动设为 Ignore columns,即不读取该字段值、也不拿它参与比对、更不会写入目标列。
常见错误现象:目标表 password_hash 被同步成 NULL 或空字符串,不是因为 Navicat “漏掉了”,而是你没把它从映射中移出,导致插入/更新时传了空值过去。
- 进入同步向导 →「表映射」页签 → 点击某张表右侧的
Map按钮 - 在弹窗左侧源字段列表中,取消勾选你想过滤的字段(如
password_hash、temp_flag、created_by) - 它们会立刻出现在右侧的
Ignore columns列表里,表示“彻底不碰” - 别依赖
Match fields by name自动匹配——如果源是user_name,目标是full_name,自动连线会失败或错位,必须手动拖拽配对
目标列有默认值或允许 NULL 才能安全忽略
忽略字段 ≠ 目标列保持原值。Navicat 的 Ignore columns 只控制“不写入”,但不阻止数据库执行 INSERT/UPDATE 语句本身。如果目标列定义为 NOT NULL 且没设 DEFAULT,而你又没在映射里给它赋值,MySQL 就会报错 Data truncated for column 'xxx' 或静默填入 NULL(取决于 SQL mode)。
- 确认目标列允许
NULL:用SHOW CREATE TABLE table_name查看字段定义 - 若需保留旧值(比如
updated_at不被覆盖),除了加进Ignore columns,还得确保该列有DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - 若字段类型是
TIMESTAMP且没设NOT NULL,MySQL 8.0+ 在 strict mode 下可能直接拒绝插入,此时必须显式加默认约束
想把多个字段合成 JSON 写进单个目标列?得靠视图预处理
Navicat 字段映射不支持表达式拼接,也不能在界面里写 JSON_OBJECT('a', col1, 'b', col2)。硬要在映射里填函数,会被当作文本字面量写死,不是动态计算。
- 在源库建视图,用数据库原生 JSON 函数预处理:
CREATE VIEW users_summary AS SELECT id, JSON_OBJECT('name', name, 'email', email) AS profile FROM users - 同步时选择这个视图,而不是原表
- 在映射中把视图的
profile字段拖到目标表的json_profile字段上 - 目标字段类型必须是
JSON(MySQL)或JSONB(PostgreSQL),否则后续解析会失败
为什么关掉“删除不匹配记录”后,目标列还是被清空了?
这不是字段过滤失效,而是你忽略了同步动作本身的副作用。比如你开了 Update records,但没把 status 加进 Ignore columns,而源表该字段为空,Navicat 就真会把目标表所有 status 更新成空值。
- 检查「选项」页是否误启了
Update records—— 如果只想新增不更新,就只勾Insert records - 预览 SQL 时重点看 UPDATE 语句的 SET 子句,确认没有你不希望出现的字段
- 若目标列必须保留原值(如审计字段
created_at、sync_time),除了加进Ignore columns,还要确保它不在任何 UPDATE 的 SET 列表里 - 最保险的做法:在「高级」→「仅同步满足条件的记录」里加
WHERE created_at > '2026-10-01',从源头缩小作用范围
真正容易被忽略的是:Navicat 的字段过滤只管“写什么”,不管“怎么写”。它不理解业务语义,也不会替你判断哪个字段该留旧值、哪个该强制覆盖。每一条忽略规则,都得你亲手核对表结构、字段约束和同步意图。











