不允许记录中出现重复索引值的索引是唯一索引,它的核心作用是保证索引列或者列组合的取值在表中是唯一的,不会出现重复的记录,是数据库层面保障数据唯一性的重要手段。
唯一索引的核心特性
唯一索引除了具备普通索引加速查询的特性之外,还有两个核心特点:
- 索引列的所有值必须唯一,不允许出现两条记录的该列值完全相同的情况
- 唯一索引列允许存储
NULL值,不过大部分数据库要求NULL值也只能出现一次,因为NULL不等于任何值包括它自身
唯一索引和主键的区别
很多开发者会混淆唯一索引和主键约束,两者的差异如下:
| 对比项 | 唯一索引 | 主键约束 |
|---|---|---|
| 是否允许NULL值 | 允许 | 不允许 |
| 一个表的数量限制 | 可以有多个 | 只能有一个 |
| 本质属性 | 索引类型 | 约束类型,会自动创建唯一索引 |
不同数据库中创建唯一索引的方式
MySQL中创建唯一索引
可以在创建表的时候直接添加唯一索引,也可以给已存在的表添加唯一索引:
-- 创建表时添加唯一索引
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
-- 给username列创建唯一索引
UNIQUE INDEX idx_username (username),
-- 给email列创建唯一索引,允许NULL值
UNIQUE INDEX idx_email (email)
);
-- 给已存在的表添加唯一索引
ALTER TABLE user_info ADD UNIQUE INDEX idx_phone (phone);
PostgreSQL中创建唯一索引
PostgreSQL的创建语法和MySQL类似,也支持两种方式:
-- 创建表时添加唯一索引
CREATE TABLE product (
id SERIAL PRIMARY KEY,
product_code VARCHAR(30) NOT NULL,
product_name VARCHAR(100),
UNIQUE INDEX idx_product_code (product_code)
);
-- 给已存在的表添加唯一索引
CREATE UNIQUE INDEX idx_product_name ON product (product_name);
SQL Server中创建唯一索引
SQL Server的语法略有不同,创建唯一索引需要使用CREATE UNIQUE INDEX语句:
-- 创建唯一索引
CREATE UNIQUE INDEX idx_employee_id ON employee (employee_id);
-- 创建表时添加唯一约束,会自动生成唯一索引
CREATE TABLE order_info (
order_id INT PRIMARY KEY,
order_no VARCHAR(20) NOT NULL UNIQUE
);
唯一索引的使用注意事项
在使用唯一索引的时候需要注意以下几点:
- 如果是对多列创建联合唯一索引,只有当所有列的值都相同时才会判定为重复,单列值重复是允许的
- 插入或者更新数据的时候如果违反唯一索引约束,数据库会直接抛出错误,需要在业务层做好异常处理
- 唯一索引也会占用存储空间,并且会降低插入和更新数据的速度,因为每次写入都需要检查唯一性,不要盲目给所有列都创建唯一索引
- 如果业务上需要保证数据唯一性,优先使用唯一索引而不是在业务代码里做判断,因为业务代码判断无法避免并发场景下的重复写入问题
唯一索引的适用场景
唯一索引适合用在需要保证数据唯一性的业务场景中,比如:
- 用户表的用户名、邮箱、手机号等需要唯一标识用户的字段
- 商品表的商品编码、订单表的订单编号等需要全局唯一的业务字段
- 需要防止重复关联的多对多关系表,比如用户角色关联表,保证同一个用户和同一个角色只关联一次
当我们需要保证某列或者多列的数据不重复的时候,唯一索引就是最合适的选择,它能在数据库层面直接拦截重复数据,比业务层的校验更可靠高效。
唯一索引unique_index数据库索引索引约束修改时间:2026-07-12 10:09:24