UNIQUE
UNIQUE 约束保证某一列(或多列组合)在全表中不会出现重复值。
UNIQUE 和 PRIMARY KEY 有点像,但有两个关键区别:①一张表只能有一个主键,但可以有多个 UNIQUE 约束;②主键不允许 NULL,UNIQUE 则允许(MySQL 中甚至可以多个 NULL,因为 NULL 被视为"未知",两个未知之间没法比较是否相等)。
UNIQUE 在底层是通过创建唯一索引实现的,所以它不仅能防重复,还能加速基于该列的查询——一举两得。
什么场景需要它?凡是业务上要求全局唯一的字段:员工邮箱、身份证号、手机号、订单编号、商品 SKU。想象一下,如果两个员工共用一个邮箱,忘记密码时系统该把重置链接发给谁?如果两条订单记录用了同一个订单号,对账时根本分不清哪笔是哪笔。UNIQUE 从数据库层面杜绝了这类"撞车"。
标准写法:
-- 列级唯一约束
CREATE TABLE 表名 (
列名 数据类型 UNIQUE
);
-- 表级唯一约束(可命名,支持多列组合)
CREATE TABLE 表名 (
列名1 数据类型,
列名2 数据类型,
CONSTRAINT 约束名 UNIQUE (列名1, 列名2)
);
以飞翔科技为例。员工邮箱必须全局唯一:
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
basic_salary DECIMAL(10,2) NOT NULL
);
-- 正常插入第一条
INSERT INTO employees VALUES (10001, '翱翔', 'aoxiang@feixiang.net', 8888.88);
-- 第二条用了相同的邮箱,直接被拒绝
INSERT INTO employees VALUES (10002, '飞翔', 'aoxiang@feixiang.net', 18888.88);
-- Error: Duplicate entry 'aoxiang@feixiang.net' for key 'email'
数据库在提交第二条 INSERT 时立即检测到邮箱冲突并拒绝执行,不会让两条记录同时存在于表中。开发者也无需在应用层写"先查再插"的代码——把唯一性的保障交给数据库,更简单也更可靠。