Navicat 同步 SQL Server 表数据本质是单向复制,需手动建目标表并确保结构兼容;映射依赖字段级配置,更新需主键/唯一索引,增量同步须手动加 WHERE 条件。
Navicat 同步 SQL Server 表数据,本质是「单向复制」,不是实时监听或触发式同步;它靠手动触发或定时任务执行一次性的 INSERT / INSERT ON DUPLICATE KEY UPDATE 操作,依赖目标表已有结构和主键约束。
Navicat 的「数据同步」功能不会创建目标表,也不会自动适配字段长度或类型。如果源表 order_id 是 BIGINT,而你在目标表里建了 INT,同步时会报错 Data truncation: data too long for column。
unified_log
DATETIME2 比 SMALLDATETIME 更安全;文本字段优先用 NVARCHAR(MAX) 或 TEXT
点击某张源表右侧的 Map 按钮后,你才能为它的每一列指定投射规则。这个界面里填的不是 SQL,而是字段级映射指令。
source_table_name 字段,值写成 'orders'(带单引号),否则 Navicat 当列名处理created_on,另一张叫 submit_time,统一映射到目标表的 event_time 即可NOT NULL,源值可能为空,就用表达式 ISNULL(phone, '')(SQL Server 语法)(SELECT name FROM customers WHERE id = orders.customer_id) —— 这种关联必须提前在源端做成视图,再把视图当源表选SQL Server 下 Navicat 同步启用更新选项后,底层发的是 MERGE 语句。它不会根据业务逻辑判断“是否更新”,只看主键或唯一索引是否命中。
order_id + line_no)→ 映射列表里必须包含这两个字段,且值能正确传递,否则会被当成新记录插入REPLACE 模式?SQL Server 不支持 REPLACE INTO,该选项在 SQL Server 同步中不可用Navicat 没有内置的 CDC(变更数据捕获)能力。所谓「增量同步」,只是让你在源表查询条件里手动加 WHERE last_updated > '2026-07-26' 这类过滤。
last_modified)或自增 ID 字段(id),且能保证单调递增last_updated > (SELECT ISNULL(MAX(event_time), '1970-01-01') FROM unified_log)
真正难的不是点几下按钮,而是厘清「哪张表的数据该进哪几列」「冲突时到底想保留谁的值」「时间字段有没有时区偏移」「NULL 和空字符串怎么归一」——这些全得在映射前想清楚,Navicat 不会替你做业务判断。