今天我们一起来理一理数据库中保证数据 唯一性 的三种机制,它们分别是 主键约束(Primary Key Constraint)、唯一性约束(Unique Constraint)、唯一性索引(Unique Index)。
1、定义:主键约束是表中用于 唯一标识每条记录 的约束,通过一列或多列(复合主键)的组合,确保表中不存在两条完全相同的记录,且 不允许空值(NULL)。
2、核心特性:
3、示例:
CREATE TABLE user (
id INT PRIMARY KEY, -- 主键
name VARCHAR(50)
);
1、定义:唯一性约束是用于保证表中 指定列(或列组合)的值在全表范围内唯一 的约束,主要用于业务逻辑上的唯一性要求(比如 "身份证号不重复")。
2、核心特性:
3、示例:
CREATE TABLE user (
id INT PRIMARY KEY, -- 主键
id_card VARCHAR(100) UNIQUE -- 唯一约束
);
1、定义:唯一性索引是一种 物理存储结构,通过对指定列(或列组合)创建索引,强制该列值唯一,同时 加速基于该列的查询(如WHERE
条件过滤、JOIN
关联)。
2、核心特性:
CREATE UNIQUE INDEX
语句创建,不依赖约束存在。3、示例:
CREATE UNIQUE INDEX idx_id_card ON user(id_card); -- 唯一索引
维度 | 主键约束(Primary Key) | 唯一性约束(Unique Constraint) | 唯一性索引(Unique Index) |
---|---|---|---|
约束类型 | 逻辑约束(数据完整性规则) | 逻辑约束(数据完整性规则) | 物理结构(索引,优化查询) |
空值允许 | 不允许任何列为 NULL | 允许列值为 NULL(允许多个) | 允许列值为 NULL(允许多个) |
数量限制 | 一个表只能有 1 个主键(可复合) | 一个表可以有多个唯一性约束 | 一个表可以有多个唯一性索引 |
与索引的关系 | 自动创建唯一索引(不可单独删除) | 自动创建唯一索引(不可单独删除) | 本身就是索引(可单独创建 / 删除) |
作用核心 | 标识记录(表的 "身份证") | 保证业务唯一性(如邮箱不重复) | 提升查询性能(附带唯一性) |
外键引用目标 | 可被其他表的外键引用 | 通常不被外键引用(语义不适合) | 不能被外键引用(不是约束) |
删除影响 | 删除主键约束,自动索引会被删除 | 删除唯一性约束,自动索引会被删除 | 删除索引,不影响约束(若存在) |
世上没有完美的人,也没有完美的事。-- 烟沙九洲