Navicat 17模型导出SQL缺失主键,主因是模型中未真正定义主键约束(仅勾选PK复选框无效),须在列的“键类型”选Primary Key或在“索引”页手动添加PRIMARY索引,且导出时必须勾选“Export foreign keys”开关。
Navicat 17 模型导出 SQL 时主键丢失的常见原因
navicat 17 的「模型」(model workspace)是独立设计空间,不是数据库反向工程视图——它不会自动读取已有表结构,也不会把你在模型里画的连线或标出的主键字段,自动转成 primary key 约束。导出脚本中缺少主键,几乎总是因为模型本身没真正定义主键,而非导出设置问题。
模型中“标记主键”不等于“定义主键约束”
在 Navicat 17 模型界面双击表 → 「列」标签页 → 勾选某列的 PK 复选框,这只是视觉标记;它不会生成 PRIMARY KEY (id) 的 DDL,除非你额外完成以下任一动作:
- 在该列右侧「键类型」下拉菜单中,明确选择
Primary Key(不是只勾PK) - 右键表 → 「编辑表属性」→ 切换到「索引」标签页 → 手动添加一条类型为
PRIMARY的索引,并包含目标列 - 导出前点击模型工具栏的「验证模型」按钮(⚠️图标),它会高亮提示“未定义主键的表”,此时才暴露问题
导出设置里容易忽略的关键开关
即使模型中已正确定义主键,导出脚本仍可能漏掉,原因在于导出选项未启用约束生成:
- 执行「导出模型为 SQL」时,必须勾选
Export foreign keys—— 这个开关实际控制所有约束导出,包括主键和唯一索引 -
Generate DROP statements before CREATE和Include AUTO_INCREMENT需按需勾选,但它们不影响主键是否存在,只影响语句完整性 - 若目标库是 MySQL,确认导出格式选的是
MySQL而非Generic SQL,后者会省略引擎、自增、主键等方言特性
为什么改了模型后重新导出,脚本还是没更新?
Navicat 17 模型导出是静态快照,不缓存中间状态。常见卡点:
- 修改模型后未保存:模型窗口标题栏无 * 号,或未按
Ctrl+S,导出仍是旧版本 - 导出时选择了「仅导出所选表」但误点了其他表,目标表被跳过
- 模型中存在同名但不同 Schema 的表(如
dev.users和prod.users),导出逻辑可能混淆上下文,建议用 Schema 前缀显式命名表 - 导出后直接执行 SQL 报错
ERROR 1075: Incorrect table definition,往往是主键列同时被设为NULL,需回到模型检查该列的NOT NULL是否勾选
模型里拖拽连线、标 PK、调样式,这些操作彼此隔离。真正决定导出内容的,只有两件事:一是模型中是否通过「索引」或「键类型」明确定义了主键约束,二是导出时是否打开了 Export foreign keys。其他视觉操作,对 DDL 生成零影响。


















