MySQL唯一索引能否做主键索引

结论先行:

✅ 可以------在没有显式主键的情况下,InnoDB 会优先选择第一个 NOT NULL 的唯一索引作为"聚簇索引(主键)"。

❌ 但不能直接把一个普通唯一索引"变成"主键,需要符合规则。

下面详细说明 👇

一、InnoDB 如何选择主键(非常重要)

InnoDB 的主键本质是 聚簇索引(Clustered Index)。

如果表中 没有定义 PRIMARY KEY,InnoDB 会按以下顺序选择:

✅ 选择顺序

  1. 显式定义的 PRIMARY KEY
  2. 第一个 NOT NULL 的唯一索引
  3. 系统自动生成的隐藏 ROW_ID(6 字节)

📌 唯一索引 ≠ 一定是主键

📌 只有 NOT NULL 的唯一索引才可能成为主键

二、示例说明

✅ 情况 1:唯一索引可充当主键

CREATE TABLE user (

email VARCHAR(100) NOT NULL,

UNIQUE KEY uk_email (email)

);

👉 InnoDB 会:

• 使用 uk_email 作为 聚簇索引

• 等价于主键(但不叫 PRIMARY KEY)

SHOW INDEX FROM user;

你会看到:

• Key_name = uk_email

• Non_unique = 0

• 实际承担主键角色

❌ 情况 2:唯一索引允许 NULL → 不能做主键

CREATE TABLE user (

email VARCHAR(100),

UNIQUE KEY uk_email (email)

);

❌ 因为允许 NULL

❌ InnoDB 不会用它作为主键

✅ 会使用隐藏 ROW_ID

三、能不能"把唯一索引改为主键"?

✅ 正确做法

ALTER TABLE user

ADD PRIMARY KEY (email);

⚠️ 前提条件:

• email 必须是 NOT NULL

• 不能有重复值

❌ 错误理解

-- 这并不会让 uk_email 成为主键

ALTER TABLE user ADD UNIQUE KEY uk_email (email);

👉 它只是唯一索引,不是 PRIMARY KEY。

四、唯一索引"充当主键"的优缺点

✅ 优点

• 省去一个额外的自增 ID

• 减少一次索引查找(覆盖索引更友好)

• 适合 业务主键明确 的场景

❌ 缺点

• 主键更新成本高(InnoDB 会移动行)

• 业务字段变更会影响所有二级索引

• UUID / 字符串做主键会导致页分裂严重

五、强烈推荐的通用设计 ✅

场景 推荐方案

绝大多数业务表 id BIGINT AUTO_INCREMENT PRIMARY KEY

业务唯一字段 UNIQUE KEY uk_xxx

高并发写入 自增 / 雪花 ID 主键

读多写少 可考虑业务唯一字段做主键

六、一句话总结

没有主键时,InnoDB 会用第一个 NOT NULL 的唯一索引当作主键;但它仍然是唯一索引,不是 PRIMARY KEY。

相关推荐
1024奇点6 分钟前
【仓颉语言入门 · 第二篇 第 15 课】
开发语言·数据库·ide·开源
疯狂学习GIS32 分钟前
将谷歌地球引擎账号升级为Contributor与Partner层级的方法
java·数据库·人工智能
gf132111138 分钟前
python_高德地图驾车时长查询
数据库·python·mysql
时间售卖铺1 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
秋风点枝1 小时前
数据库 01 · 体系结构与存储引擎
数据库·mysql
CodeGL1 小时前
15、Python 访问数据库
数据库·python
小此方1 小时前
Re:Mysql数据库基础篇(五):拒绝脏数据!一文吃透MySQL表的约束(主键、唯一键、外键与实战案例)
数据库·mysql
想做小南娘,发现自己是女生喵1 小时前
LAN Device Monitor 第二周学习文档
java·服务器·数据库
byte轻骑兵1 小时前
【TextIn xParse + WorkBuddy】把8小时的标书审查压进1小时:招标要求逐条核验与废标风险预警工作台
大数据·数据库·aigc·textin·ai数据层基础设施
翔云1234562 小时前
Gaea(小米MySQL Proxy)整体架构
运维·数据库·mysql