navicat 16 中组合主键需同时勾选多个字段并确认 ddl 显示 primary key (a,b),外键引用必须严格匹配字段数量、类型和顺序,否则 er 图关系线无法自动生成,且反向工程依赖数据库真实约束定义。
navicat 16 模型中定义组合主键本身不难,但生成的 er 图能否正确显示关系、是否触发外键自动连线,完全取决于你如何声明主键和外键——不是画线画出来的,而是靠约束定义驱动的。
在模型里建表时直接勾选多个字段设为 Primary Key
新建实体(表)后,添加字段时不能只靠“设为主键”图标点单个字段;必须进到字段列表右键 → Primary Key,或在字段属性面板里把 PK 列手动打勾。关键点是:要同时勾选两个及以上字段,Navicat 才会把它识别为复合主键(Composite Primary Key),并在模型元数据里标记为 PRIMARY KEY (col_a, col_b)。
- 如果只勾一个字段,哪怕后面手工加
UNIQUE或INDEX,也不会形成组合主键语义 - 字段顺序会影响后续外键引用——比如外键必须按相同顺序引用
(col_a, col_b),颠倒顺序会导致反向工程失败或关系线不生成 - Navicat 不会在 UI 上显式标注“组合主键”,只能通过双击表 → 查看 DDL 或导出 SQL 来确认是否生成了括号形式的
PRIMARY KEY (a,b)
用组合主键当外键时,必须在关联表里严格匹配字段数量和顺序
ER 图里的关系线不会凭空出现。只有当你在另一张表中创建外键,并且其列数、类型、顺序与目标组合主键完全一致时,Navicat 才会在模型中自动生成连线(前提是反向工程或模型同步开启)。
- 例如:
orders表主键是(shop_id, order_no),那么order_items表必须定义外键FOREIGN KEY (shop_id, order_no) REFERENCES orders (shop_id, order_no) - 少一个字段、类型不匹配(如
INTvsBIGINT)、顺序错位((order_no, shop_id)),都会导致关系线缺失,即使你在图上手动拖拽也无效 - Navicat 的模型校验器(Model → Validate Model)会报
Foreign key references non-primary key或Mismatched column count,这类错误必须修复才能让关系线稳定显示
反向工程导入已有库时,组合主键和外键必须已存在于数据库中
如果你是从真实数据库反向生成模型,Navicat 能否带出组合主键和对应关系线,完全取决于源库是否真正定义了这些约束。它不会猜,也不会补。
- MySQL 中用
ALTER TABLE t ADD PRIMARY KEY (a,b);定义的组合主键,反向后能识别;但仅靠索引或业务逻辑约定的“逻辑组合键”,不会变成 PK,更不会产生关系线 - PostgreSQL 或 SQL Server 同理:必须是
PRIMARY KEY (x,y)和明确的FOREIGN KEY (x,y) REFERENCES ...,否则模型里就是孤立表 - 若源库没建外键,即使你知道逻辑关系,也得回到 Navicat 模型里右键表 →
Add Foreign Key,手动指定全部字段——漏一个,连线就断
最常被忽略的一点:Navicat 模型里的组合主键定义和外键引用,最终要落地成可执行的 DDL。如果你只在图上“看起来连上了”,但没检查生成的 SQL 是否含正确的多列约束,那导出建表脚本或同步到库时大概率失败。别信视觉,信 DDL 面板。











