Navicat 16 的 ER 图同步到 PostgreSQL 需通过“Synchronize to Database”向导触发,且要求连接类型正确、模型使用兼容数据类型与外键约束、用户具备 CREATE SCHEMA 等权限,版本不低于 10,并须预览 SQL 检查 DEFAULT、ENUM、大小写等 PostgreSQL 特定语法问题。
Navicat 16 的 ER 图同步功能对 PostgreSQL 有明确限制
navicat 16 支持将 er 模型同步到 postgresql,但不是“直接同步”——它必须经过显式的 synchronize to database 向导触发,且该操作仅在模型与目标数据库结构存在可比对基础时才可用。如果你右键模型点不到该菜单,或点击后报错、灰显,大概率是以下某个条件未满足:
- 目标连接未选中 PostgreSQL 类型(比如误用了 MySQL 连接配置);
- 模型中使用了 PostgreSQL 不支持的数据类型(如
JSONB在旧版模型模板里可能被识别为JSON,而同步时无法映射); - 模型里定义了外键但未指定参照动作(
ON DELETE CASCADE等),PostgreSQL 要求显式声明,Navicat 默认生成脚本时会跳过这类关系,导致同步按钮不可用或预览为空。
同步前必须手动确认 PostgreSQL 连接的权限和版本兼容性
即使模型看起来“合法”,Navicat 也会在同步启动瞬间检查目标库的实际能力。常见卡点包括:
-
CREATE SCHEMA权限缺失:若模型里设定了 schema(如public以外的命名空间),而连接用户没有CREATE权限,同步会直接失败,错误信息类似permission denied for database xxx; - PostgreSQL 版本低于 10:部分模型特性(如 GENERATED ALWAYS AS IDENTITY)无法生成对应 DDL,Navicat 会静默跳过字段或报语法错误;
- 连接参数未启用
search_path:若模型指定 schema 为sales,但连接字符串没带options=-c%20search_path%3Dsales,同步脚本可能把表建到public下,造成逻辑错位。
“同步到数据库”按钮不可用的三个高频原因
这不是 Bug,而是 Navicat 的主动防护机制。以下情况会导致该按钮始终灰显:
PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。
- 模型尚未保存为
.ndm2文件:临时新建的空白模型不触发同步逻辑,必须先File → Save Model As; - 目标连接处于“未测试”状态:Navicat 不依赖“测试连接”结果,而是读取连接配置中的
host、port、database字段是否完整,缺任意一项即禁用同步; - 模型中包含 PostgreSQL 不兼容对象:比如设置了
Auto Increment属性但未切换为GENERATED BY DEFAULT AS IDENTITY模式(需在字段属性面板手动修改“Identity”开关),Navicat 会认为该模型不可安全同步。
同步成功但表没建出来?重点检查 SQL 预览里的 DDL 生成逻辑
点击 Synchronize to Database 后,务必点开 Preview SQL 查看实际要执行的语句。PostgreSQL 的严格语法常让 Navicat 生成“看似正确实则无效”的脚本:
- 字段默认值写成
DEFAULT NOW():PostgreSQL 要求加括号为DEFAULT NOW()是合法的,但若模型里填的是NOW(无括号),Navicat 可能生成DEFAULT NOW,执行时报syntax error at or near "NOW"; - 枚举类型(
ENUM)未提前创建:Navicat 不会自动建CREATE TYPE,如果模型里用了自定义 enum,必须先在目标库手动执行建 type 语句,否则同步卡在第一条CREATE TABLE; - 大小写敏感处理失效:PostgreSQL 默认小写标识符,若模型中表名含大写字母(如
UserProfile),Navicat 默认会加双引号生成"UserProfile",但若你勾选了Convert object names to lowercase(在同步向导高级选项里),它就会强行转成userprofile,和模型定义冲突。
这些细节不会在界面报错,只会在预览 SQL 或执行日志里暴露。别跳过预览,那是唯一能提前发现 PostgreSQL 兼容性问题的地方。










