navicat premium 不支持在逆向工程中按前缀(如user_%)一键筛选表,必须手动勾选;可行方案为:①建临时库仅导入目标前缀表结构后逆向;②oracle用同义词/sqlite用视图逻辑隔离并启用include views选项。

Navicat Premium 里没有“按前缀筛选表再生成ER图”的一键功能
它不支持在 Reverse Engineer 对话框中输入 user_% 或正则表达式来批量匹配表名。所有表必须手动勾选,哪怕你有 50 张 log_ 开头的表,也得一张张点——除非提前准备策略绕过这个限制。
真正可行的两种实操路径
核心思路:不让 Navicat 去“猜”哪些表要进模型,而是让它只看到你想让它看到的那批表。
- 方案一(推荐):建一个临时 schema / database,只导入目标前缀表的结构(适用于 MySQL / PostgreSQL / SQL Server)
→ 在目标库中执行CREATE TABLE tmp_user_profile LIKE user_profile;等语句复制表结构(不带数据),或用 Navicat 的“仅结构导出+导入”功能批量创建空表;
→ 新建一个连接指向这个临时库;
→ 对该连接执行Reverse Engineer,直接全选,无干扰项。 - 方案二(Oracle / SQLite 适用):用视图或同义词做逻辑隔离
→ Oracle 中可为user_%表批量建同义词:CREATE SYNONYM v_user_login FOR user_login;;
→ SQLite 中无法建同义词,但可用ATTACH加载另一个数据库文件,再CREATE VIEW聚合目标表;
→ 在 Navicat 中把这批视图/同义词当“真实表”导入模型(注意:必须勾选Include views选项,否则不可见)。
为什么不能靠“右键数据库 → 逆向到模型”自动过滤
因为该操作本质是调用 SELECT table_name FROM information_schema.tables(或对应系统视图),而 Navicat 的 UI 层未暴露 WHERE 条件入口。即使你改了连接的默认 schema,只要底层 information_schema 里存在其他表,它们仍会出现在勾选列表中——你删不掉,只能不勾。
常见错误现象:
– 勾选了 10 张 sys_ 表,结果 ER 图里全是无关连线;
– 导入后发现外键指向了未选中的表,关系线断开或错连;
– 某些字段类型被识别为 UNKNOWN,尤其在 Oracle 中未启用 DBA_TAB_COLUMNS 权限时。
容易被忽略的兼容性细节
不同数据库对前缀表建模的影响差异很大:
- MySQL:外键约束必须显式定义且引擎为 InnoDB,否则
Reverse Engineer不生成连线; - Oracle:需确保用户有
SELECT_CATALOG_ROLE或对ALL_CONSTRAINTS、ALL_CONS_COLUMNS的查询权限,否则外键关系为空; - SQLite:必须提前执行
PRAGMA foreign_keys = ON;并在建表 DDL 中写明FOREIGN KEY (...) REFERENCES ...,仅靠命名约定(如user_id字段)不会被识别为关系。
如果你的前缀表之间本就没有外键约束,Navicat 生成的只是孤立实体框——它不会根据字段名相似性推测关系,这点和 PowerDesigner 或 dbdiagram.io 完全不同。











