Navicat 17中“查看ER图”仅为只读快照,不可编辑导出;真要生成可交付ER图(如PDF/PNG)必须走“逆向数据库到模型”路径,并人工核对权限、驱动类型、只读模式三条件,否则缺表断线;模型属性须严格匹配目标库版本、规避保留字、大小写一致;同步到数据库会暴力DROP+CREATE清空数据,应改用生成SQL脚本人工审核执行。
Navicat 17 里“查看 ER 图”和“建模导出 ER 图”是两套完全独立的流程
很多人点开数据库后直接点 查看 → er 图标,看到连线就以为完成了——这其实是只读快照视图,不能编辑、不能保存布局、不能导出。真要生成可交付的 er 图(比如给开发/产品看的 pdf 或 png),必须走「模型」路径。navicat 17 把这两者彻底分开:一个是实时元数据渲染,一个是离线建模工作区。
逆向工程生成模型前必须手动确认三件事,否则大概率白忙
右键数据库 → 逆向数据库到模型 不是万能按钮。它会直接读取 information_schema(MySQL)或 pg_catalog(PostgreSQL),但前提是:
- 当前连接用户对系统 schema 有
SELECT权限(仅业务库权限不行) - 连接类型必须是原生驱动,比如 MySQL 必须选
MySQL (Native),不能选 ODBC - 目标库不能处于只读模式;PostgreSQL 若事务隔离级别设为
READ ONLY,外键可能识别为空
漏掉任一条件,生成的模型里就会缺表、断关系线,或者字段类型全显示为 UNKNOWN。
导出前不检查模型属性,生成的 SQL 很可能在目标库报错
模型编辑器左下角有个 模型属性 按钮,点开后必须核对:
-
数据库类型和实际连接的版本严格一致(例如模型设成MySQL 8.0,但连的是MySQL 5.7,JSON字段会直接生成失败) - 所有表名/字段名是否撞了保留字(如
order、group),Navicat 默认不加反引号,执行时直接ERROR 1064 - 外键引用的父表名大小写是否完全匹配(
user≠User),模型里拼错一个字母,生成的FOREIGN KEY ... REFERENCES就指向空表
这些检查没法跳过,Navicat 17 不做语法预检,也不提示“你写的表名是保留字”。
“同步到数据库”不是更新,是 DROP + CREATE 全量覆盖
模型画完想落地建表?别点 同步到数据库 —— 它不会比对差异,而是暴力清空目标库所有表再重建。哪怕你只改了一个字段长度,原有数据也会全丢。真正安全的做法是:
- 走
文件 → 生成 SQL 文件,勾选创建数据库、创建表、创建外键 - 手动在 SQL 前加
IF NOT EXISTS或用DROP TABLE IF EXISTS包裹 - 把生成的 SQL 粘贴进查询窗口,人工 review 后再执行
模型设计器本身不执行任何语句,也不记录哪条 SQL 对应哪个操作——同步日志只写“成功”,不输出具体命令,出问题只能回头重跑生成脚本比对。











