navicat模型中的主键和唯一键需通过columns页勾选pk或indexes页添加unique索引实现,但仅建模不导出执行则数据库无约束;导出sql时须启用“export indexes and constraints”,否则主键/唯一键丢失。
navicat 的「模型」(model)功能和「表设计」(design table)不是一回事:模型是逻辑建模工具,用于画er图、生成ddl脚本,不直接操作数据库;而主键/唯一键的实际生效依赖的是最终生成并执行的sql语句。如果你在模型里设了pk或uk但没导出执行,数据库里根本不会存在这些约束。
模型里怎么添加主键字段
在 Navicat Model 编辑界面,双击实体(Entity)打开属性面板,在「Columns」列表中找到目标字段,勾选 PK 复选框即可标记为主键。但注意:
- 一个实体只能有一个
PK字段被勾选(Navicat Model 不支持联合主键的图形化拖拽设置,必须手动编辑DDL或转到表设计界面处理) - 勾选
PK后,该字段自动获得NOT NULL和唯一性语义,但模型本身不校验类型——你仍可把它设为VARCHAR,导出SQL时会生成无效语句(MySQL 拒绝VARCHAR PRIMARY KEY AUTO_INCREMENT) - 如果模型中已有数据模拟,
PK字段值必须全部非空且唯一,否则后续同步到数据库会失败
模型里怎么添加唯一键(Unique Key)
Navicat Model 中没有独立的「UK」图标或开关,唯一键需通过「Index」实现:在实体属性面板切换到 Indexes 页签 → 点击 Add Index → 类型选 Unique → 在下方字段列表中勾选要参与唯一约束的列。
关键限制:
-
Unique索引允许含NULL值(单个NULL不触发冲突),但模型不提示这点,容易误以为等同于主键语义 - 不能跨实体建唯一约束(比如“订单号+用户ID”这种业务组合唯一,必须在单个实体内定义,或留到表设计阶段用 SQL 补)
- 导出 DDL 时,Navicat 默认生成
CREATE UNIQUE INDEX而非UNIQUE KEY子句,部分旧版 MySQL 对前者支持较弱,建议导出后手动改写为UNIQUE KEY
从模型导出SQL后,为什么主键没生效
常见原因是导出设置漏掉了关键选项。点击 File → Export to SQL File… 后,必须确认以下两项已勾选:
-
Generate DROP statements before CREATE(避免旧结构残留干扰) -
Export indexes and constraints(默认可能未启用,不勾选则PRIMARY KEY和UNIQUE全部丢失)
另外,如果目标库已存在同名表,Navicat 默认不会覆盖——它生成的是纯 CREATE TABLE,而非 ALTER TABLE。此时需手动执行或改用「同步到数据库」功能(右键模型 → Synchronize to Database),但该操作要求连接活跃且权限足够。
主键和唯一键在模型里画错了,能直接改吗
可以,但改法有坑:
- 删掉已有的
PK字段再重选,模型会清空原字段的PK标记,但不会自动删掉之前生成的索引(需手动进Indexes页签删除冗余项) - 修改字段类型(比如把
INT改成VARCHAR)后,原先设的PK仍保留勾选状态,导出SQL会报错,必须人工检查 - 模型不校验外键引用关系是否闭环——比如 A 表的
user_id设为 FK 指向 B 表,但 B 表没设对应主键,导出时不会预警,执行时才爆ERROR 1005
真正起作用的永远是最终落到数据库里的那条 CREATE TABLE 语句。模型只是草稿纸,别信它的实时预览,导出后务必用 SHOW CREATE TABLE 对比验证。











