必须整行多选后右键设主键——navicat 主键为单点覆盖式,ctrl 点击 pk 列仅生效最后一个;复合主键需在“设计表”页按序高亮字段→右键设主键→保存,且所有字段须 not null、支持索引、非 text/json 类型。
不能靠“勾选多个字段的主键复选框”来实现——navicat 的主键操作是单点覆盖式,不是批量叠加式。真正有效的做法是整行多选后统一右键设主键。
为什么 Ctrl 多选字段再点 PK 列只生效一个?
因为 PK 列(钥匙图标)是逐行切换状态的:你点第一行,它变灰;点第二行,第一行自动取消,只剩第二行生效。这不是 UI 延迟或 Bug,而是 Navicat 的设计逻辑——每次点击都等价于执行一次 ALTER TABLE ... DROP PRIMARY KEY; ADD PRIMARY KEY (col)。
- 现象:
SHOW CREATE TABLE里只看到PRIMARY KEY (`a`),而不是预期的PRIMARY KEY (`a`, `b`) - 检查方式:回到“设计表”页,看字段左侧是否只有一把带数字 1 的锁,其他字段没锁标
- 根本原因:你没做“整行高亮+右键”,而是在
PK列里点了两次
正确设置复合主键的三步操作
必须在“设计表”界面完成,且所有目标字段已存在、未保存前可随时重试。
- 按住
Ctrl(Windows/Linux)或Command(macOS),用鼠标左键依次点击多个字段所在行(整行高亮,不是只点PK列) - 右键任意一个被高亮的行 → 选择“主键”(此时菜单不是灰色的,说明前置条件满足)
- 保存表结构;Navicat 会按你高亮顺序生成
PRIMARY KEY (col_a, col_b),字段旁显示“主键1”“主键2”
右键“主键”菜单灰色不可点?三个硬性卡点
Navicat 不提示具体缺哪项,但必然是以下其一不满足:
-
Null列有任意一个是YES:所有字段必须为NOT NULL,且需手动勾掉“允许空值” - 字段类型不支持索引:如
TEXT、JSON、MEDIUMTEXT,得改成VARCHAR(255)或INT等基础类型 - 不在“设计表”页:你在“表数据”或“ER 图”页右键,菜单必然禁用
字段顺序影响查询性能,不能靠拖拽调整
“主键1”“主键2”不只是序号,它直接决定 B+ 树索引的排序和范围扫描能力。
- 例如
PRIMARY KEY (tenant_id, order_no)支持WHERE tenant_id = ? AND order_no > ?走全索引,但WHERE order_no = ?就无法高效使用 - 顺序定错后,不能拖动字段调换位置——必须先右键取消全部主键,再重新
Ctrl多选并按正确顺序高亮 - 已有数据时,Navicat 保存会校验联合值唯一性,重复即中断,不提供“忽略”选项
最易被忽略的是:Navicat 不会在界面上告诉你哪个字段因类型或空值被静默跳过,只能靠导出 SQL 或查 SHOW CREATE TABLE 来确认最终定义是否符合预期。











