Navicat模型无法直接切换目标数据库引擎,须通过“文件→转换模型为→PostgreSQL”重建语义层;自动映射存在DATETIME时区、ENUM丢失、JSON转json非jsonb等问题;导出SQL前需检查SERIAL主键、默认值、约束名,并清理反引号、ENGINE等MySQL语法。

Navicat模型设计器里“逆向表到模型”后怎么切目标数据库
不能直接改模型属性切换引擎类型——Navicat的模型一旦基于MySQL逆向生成,其底层元数据就绑定为MySQL方言。必须通过「转换模型为」动作重建语义层。
操作路径是:在模型窗口中点击 文件 → 转换模型为 → 选择 PostgreSQL 及对应版本(如 15 或 16)。这步会重新解析所有表、字段、索引和外键,并映射为PostgreSQL兼容的定义。
- 务必选对PostgreSQL版本:9.5以下不支持
JSONB,12+才默认启用GENERATED ALWAYS AS表达式列 - 如果原MySQL表用了
TINYINT(1)模拟布尔值,转换后会变成SMALLINT而非BOOLEAN,需手动双击字段→改类型→勾选Boolean - 模型转换不处理存储过程、函数、事件,这些得单独导出重写
字段类型自动映射有哪些常见失真
Navicat的自动映射按“功能近似”原则,但PostgreSQL对类型更严格,容易埋坑。
-
VARCHAR(255)→character varying(255):没问题,但若MySQL原为TEXT,可能被转成text(无长度限制),而某些ORM依赖长度声明 -
DATETIME→timestamp without time zone:这是最大陷阱——MySQL的DATETIME无时区概念,但PostgreSQL默认不带时区;若业务依赖本地时间,应手动改为timestamp with time zone -
ENUM类型直接丢失:MySQL的ENUM('a','b')会被转成character varying(255),需后续用CREATE TYPE重建并修改字段类型 -
JSON字段转成json而非jsonb:性能差很多,建议导出SQL前手动点开字段→类型选jsonb
导出SQL脚本前必须检查的三个地方
模型转完只是中间态,真正落地靠导出的SQL。不检查就执行,大概率建表失败或数据异常。
- 主键是否带
SERIAL:MySQL的AUTO_INCREMENT不会自动转成SERIAL,而是普通INTEGER。要双击主键字段→勾选Identity→选ALWAYS或BY DEFAULT - 默认值是否合法:MySQL的
CURRENT_TIMESTAMP会被转成now()(正确),但''空字符串默认值可能变成NULL,需手动补回DEFAULT '' - 约束名是否重复:Navicat给外键/唯一约束生成的名称如
fk_user_role_id,若多个表同名,PostgreSQL建表会报错relation "fk_user_role_id" already exists,需提前重命名
为什么导出的SQL在psql里执行常报错
Navicat导出的SQL默认含MySQL风格语法糖,PostgreSQL不认。
- 语句末尾分号
;被包在单引号里:比如COMMENT ON COLUMN t.id IS '主键;';→ PostgreSQL把分号当字符串内容,后面真正的分号就孤悬了,报错syntax error at or near ";" - 反引号
`没被清除:MySQL用`user`,PostgreSQL要用双引号"user",否则user被识别为系统函数名,建表失败 - 字符集声明残留:
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4整段要删掉,PostgreSQL不支持ENGINE,且库级字符集由CREATE DATABASE决定
最稳做法是导出后用文本编辑器全局替换:` → ",删所有ENGINE=及之后内容,再逐条检查COMMENT和DEFAULT语句里的引号闭合。


















