唯一索引是MySQL中强制列值唯一性的索引类型,既保障数据不重复又提升查询效率;它与唯一约束互为底层实现,允许一个NULL值,支持单列或联合索引,违反时抛错需应用层处理。

唯一索引是 MySQL 中一种强制列值唯一性的索引类型,它既保障数据不重复,又提升查询效率。它和唯一约束密切相关——创建唯一约束时,MySQL 会自动建立一个唯一索引;反过来,显式创建唯一索引也等效于加了一层唯一性校验。
唯一索引的核心特点
• 允许 NULL 值,但只允许一个 NULL(不是多个)
• 同一张表可以有多个唯一索引
• 支持单列或多个列组合(即联合唯一索引)
• 插入或更新时若违反唯一性,语句直接报错(如 ERROR 1062),事务不会自动回滚,需应用层处理
唯一索引 vs 唯一约束
• 语法上:UNIQUE KEY 是约束定义,UNIQUE INDEX 是索引定义,但效果一致
• 实现上:两者底层都依赖唯一索引,MySQL 不会为同一个字段重复建索引
• 区别在于语义:约束强调业务规则(如“邮箱必须唯一”),索引强调技术实现(如“按邮箱快速查找+防重”)
• 建议优先用 CONSTRAINT 语法定义唯一约束,更清晰表达设计意图
典型使用场景
• 用户表的 email 或 phone 字段:防止重复注册
• 订单表的 order_no 字段:确保每笔订单编号全局唯一
• 购物车表的 (user_id, product_id) 组合:限制同一用户对同一商品只能有一条购物车记录
• 配置表的 key_name 字段:避免配置项键名冲突
怎么创建和检查
• 创建单列唯一索引:ALTER TABLE users ADD UNIQUE INDEX uk_email (email);
• 创建联合唯一索引:ALTER TABLE cart ADD UNIQUE INDEX uk_user_prod (user_id, product_id);
• 查看已有唯一索引:SHOW INDEX FROM users WHERE Non_unique = 0;
• 删除唯一索引:DROP INDEX uk_email ON users;(注意:若该索引由 UNIQUE CONSTRAINT 自动创建,需用 DROP CONSTRAINT 语法删除约束)










