Navicat结构同步需手动展开schema并逐个勾选源表与目标表,不支持自动跨schema匹配或批量映射;必须确保连接启用schema加载、默认schema设置正确,并通过Properties验证完整对象路径。
结构同步里怎么选不同 schema 的源表和目标表
navicat 的「结构同步」不认“同名表跨 schema”这种逻辑,默认只按表名匹配。你连了两个 postgresql 数据库,各自有 public.users 和 dev.users,点「比对」时它不会自动把 public.users 和 dev.users 拉一起——除非你手动指定。
实操路径是:在结构同步向导第一步「选择源和目标」时,不直接选数据库节点,而是展开数据库 → 展开 schemas → 逐个勾选具体 schema 下的表。例如:
- 源:勾选
prod_schema.users - 目标:勾选
dev_schema.users
注意:必须确保两个连接都已启用 schema 支持(PostgreSQL/SQL Server/Oracle 都行,MySQL 5.7+ 用 database 模拟 schema,也支持)。如果只看到数据库名、看不到 schemas 节点,检查连接属性里是否勾选了「Show system objects」或「Load schemas」。
为什么点了“比对”却提示“no differences”但字段明明不一样
常见原因是 Navicat 默认按「表名 + 所属 schema 名」做严格匹配,而你在向导里没显式展开 schema,它实际比的是 public.users ↔ public.users(即使你连的是两个不同库),结果自然“没差异”。
另一个隐蔽坑是:目标库连接里未正确设置默认 schema。比如你连的是 mydb,但没在连接属性 → 「Advanced」里填 search_path=dev_schema,Navicat 就会默认查 public,导致读不到 dev_schema.users 的真实结构。
验证方法:右键目标连接 → 「New Query」,执行 SELECT table_schema, table_name FROM information_schema.tables WHERE table_name = 'users';,确认返回的 table_schema 是你期望的那个。
多 schema 映射能批量配吗?有没有配置文件或全局开关
没有。Navicat 不提供 schema 级别的映射配置,更不存在 schema_mapping.conf 或界面里的「Schema Mapping Rules」选项。
所有 schema 关联都得靠人工在每次结构同步任务中完成,包括:
- 每次都要重新展开两个连接的 schema 树,手动勾选对应表
- 如果要同步
prod.a→staging.b这种非同名表,只能先在向导里选中,再进「Edit Script」手动改生成的 DDL 中的表名 - 无法保存“下次自动把 prod_schema 映射到 dev_schema”这类规则
这意味着:10 个 schema 对 10 个表,就得点 100 次勾选;一旦漏一个,生成的 SQL 就不包含那张表的变更。
对比报告里 schema 名不显示,怎么确认比的是不是我要的那组
HTML 报告默认只显示 users,不带 schema 前缀,极易误判。必须在生成报告前确认两件事:
- 对比窗口左上角显示的源连接名后括号里,是否明确写了 schema,例如
prod_db (prod_schema) - 右键任意差异行 → 「Properties」→ 查看
Source Object和Target Object的完整路径,例如prod_schema.users.idvsdev_schema.users.id
如果 Properties 里只显示 users.id,说明 Navicat 根本没识别到 schema 层级,大概率是你连接参数或权限问题,得回退检查连接配置。
跨 schema 结构比对这件事,本质是靠人眼对齐路径、靠手动勾选建立关联。Navicat 不做推断,也不记上下文,每一步都得你亲手钉死。











