在Navicat 15中建联合唯一索引须手动逐行添加多列字段、索引类型必须选UNIQUE而非仅勾“唯一”复选框,并通过SQL预览确认生成ALTER TABLE ADD UNIQUE语句含全部字段,否则仅生效首列。
在 Navicat 15 的「索引」页里选多列,不是只点一次“添加”
很多人卡在这一步:右键表 → 设计表 → 切到「索引」页 → 点「+」→ 填完名字就直接保存,结果只生效了第一个字段。navicat 15 默认新建索引时只允许单列,**必须手动逐个添加字段**才能组成联合唯一索引。
- 点击「+」后,在「栏位」列右侧的下拉框里选第一个字段(比如
user_id) - 再点同一行下方的「+」图标(或按 Tab 键跳到下一行),继续选第二个字段(比如
email) - 重复操作,直到所有需要参与唯一约束的字段都填进不同行
- 每行可单独设
ASC/DESC,但 MySQL 5.7 及更早版本会忽略DESC,只按ASC存储
索引类型必须选 UNIQUE,不能只勾“唯一”复选框
Navicat 15 的索引配置界面有两处容易混淆:“索引类型”下拉菜单 和 “唯一”复选框。**必须把“索引类型”设为 UNIQUE,而不是留默认的 NORMAL 再勾选“唯一”**——后者在部分连接类型(如 PostgreSQL)下可能无效,且不保证生成带 UNIQUE KEY 的 DDL。
-
UNIQUE类型会生成ADD UNIQUE INDEX或CREATE UNIQUE INDEX语句 - 如果误选
NORMAL,哪怕勾了“唯一”,Navicat 可能只建普通索引,起不到防重作用 - 命名建议用
uk_table_col1_col2格式(如uk_users_user_id_email),避免自动生成的idx_12345类名称
保存前务必打开 SQL 预览,确认生成的是多列 UNIQUE 语句
Navicat 15 在保存时会执行一条 ALTER TABLE 语句,但它不会校验你选的字段是否真能组合出业务需要的唯一性。**必须点开「SQL 预览」窗口,肉眼核对生成的 DDL 是否符合预期**。
- 正确示例:
ALTER TABLE `users` ADD UNIQUE `uk_users_user_id_email` (`user_id`, `email`) - 错误信号:只出现一个字段(
(`user_id`))、类型是INDEX而非UNIQUE、或语句里有USING BTREE但没提UNIQUE - 如果预览里字段顺序是
(email, user_id),但业务要求是user_id优先过滤,就得删掉重建,拖动字段行调整顺序
已有数据时加联合唯一索引,失败大概率是因为历史重复值
Navicat 15 执行保存操作时若报错 Duplicate entry 'xxx' for key 'uk_xxx',说明表里已存在违反该唯一规则的行。它不会自动帮你清理,也不会跳过。
- 先查重复:
SELECT user_id, email, COUNT(*) FROM users GROUP BY user_id, email HAVING COUNT(*) > 1 - 根据业务决定是删冗余行,还是用
UPDATE统一修正某字段值 - 大表操作前,在从库或测试环境跑一遍,避免线上锁表时间过长(MySQL 5.6+ 默认
ALGORITHM=COPY)
SHOW CREATE TABLE users 里能看到明确的 UNIQUE KEY `uk_users_user_id_email` (`user_id`,`email`),这才是真正落地的信号。别只信 Navicat 界面里的“索引列表”显示——那只是元数据快照,不是执行结果。











