不能——navicat正向工程仅生成sql脚本,需手动执行;必须选对目标dbms类型、关闭数据库名引用、检查并修正语法兼容性(如删engine/charset子句),否则生成的sql会因跨库引用或方言不兼容而报错。
navicat 的模型(model)本身不直接建表,它只生成 sql 脚本;能否得到可用的建表语句,取决于你是否在正向工程(forward engineering)环节做对三件事:选对目标 dbms、关掉数据库名引用、手动检查语法兼容性。
正向工程生成的 SQL 为什么不能直接执行
因为 Navicat 的「正向工程」本质是代码生成器,不是执行器。它默认可能包含:CREATE DATABASE、USE mydb、带反引号的标识符(如 `user`)、MySQL 特有子句(如 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4),而你的目标库可能是 PostgreSQL 或 SQL Server——这些语法一跑就报 ERROR 1064 (42000)。
- 目标 DBMS 类型选错(比如连的是 PostgreSQL,却用 MySQL 模式生成)→ 语法不识别
- 没关
Include database name in object names→ 生成mydb.users,但生产环境通常禁止跨库引用 - 模型里用了
JSON字段,而导出时目标 DBMS 选的是旧版 MySQL → 转成TEXT但保留了JSON_VALID()检查 → 执行时报错
如何配置正向工程导出合规建表语句
右键模型 →「正向工程」→ 关键操作只有四步:
- 勾选
Generate CREATE statements,取消勾选Generate DROP statements(除非你真要删旧表) - 在
Target DBMS下拉菜单中,必须选跟你实际连接的数据库类型一致(例如你连的是PostgreSQL 15,就选PostgreSQL 12+,别留默认的 MySQL) - 点
Next进入 Options 页面,关掉Include database name in object names - 预览页里逐行扫一遍:删掉所有
CREATE DATABASE和USE;把ENGINE=...、DEFAULT CHARSET=...这类 MySQL 专属子句全删掉
生成后 SQL 还执行失败?三个高频错误怎么修
ERROR 1050 (42S01):表已存在 → 在 CREATE TABLE 前手动加 IF NOT EXISTS(MySQL 8.0+/PostgreSQL 9.6+ 支持;SQL Server 得写成 IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'xxx'))
ERROR 1215 (HY000):外键建不起来 → 不是模型画错了,而是建表顺序不对。比如 orders 表外键引用 users,但生成脚本里 orders 在前、users 在后。解决办法:把建表语句按依赖关系重排,或拆成两批——先全部 CREATE TABLE,再统一 ALTER TABLE ... ADD FOREIGN KEY
ERROR 1064:语法错 → 先确认你复制粘贴时有没有混入不可见字符(尤其是从预览窗口直接 Ctrl+C);再检查字段类型是否合法(比如 PostgreSQL 不认 TINYINT,得换成 SMALLINT;SQL Server 不认 auto_increment,得换成 IDENTITY(1,1))
真正麻烦的不是生成语句,而是模型和目标库之间的“语义鸿沟”:Navicat 不会帮你把 MySQL 的 datetime DEFAULT CURRENT_TIMESTAMP 自动转成 PostgreSQL 的 timestamp DEFAULT now(),也不会提醒你 VARCHAR(255) 在 Oracle 里得写成 VARCHAR2(255)。这些都得人工一行行核对。











