Awesome Claude Skills:构建AI工作流的终极指南与完整实践
2026/6/24 6:01:22
- 你是否知道添加唯一约束的多种方式?(创建表时 / 修改表时)
- 能否区分 “单列唯一约束” 和 “多列唯一约束” 的适用场景?
- 是否了解唯一约束的核心特性?(比如与主键的区别、对 NULL 值的处理)
唯一约束(UNIQUE Constraint)是 MySQL 中用于限制字段(或多个字段组合)的值不能重复的一种约束,它能保证数据表中指定字段的唯一性,防止重复数据插入,从而保障数据的有效性。比如:用户表的phone(手机号)字段添加唯一约束后,就无法插入两个手机号相同的用户;订单表的order_no(订单编号)添加唯一约束后,不会出现重复的订单编号。
-- 基础表结构(未加唯一约束) CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, -- 主键(自增) `username` VARCHAR(50) NOT NULL, -- 用户名 `phone` VARCHAR(11), -- 手机号 `email` VARCHAR(50), -- 邮箱 `dept_id` INT -- 部门ID );在CREATE TABLE语句中,通过UNIQUE关键字直接给字段添加唯一约束,支持「单列唯一」和「多列唯一」两种场景。
CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL UNIQUE, -- 单列唯一约束:用户名唯一 `phone` VARCHAR(11), `email` VARCHAR(50), `dept_id` INT );CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `phone` VARCHAR(11), `email` VARCHAR(50), `dept_id` INT, -- 单列唯一约束:指定约束名称(uq_sys_user_phone),更易维护 UNIQUE KEY `uq_sys_user_phone` (`phone`) );CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `phone` VARCHAR(11), `email` VARCHAR(50), `dept_id` INT, -- 多列联合唯一约束:同一部门内用户名唯一 UNIQUE KEY `uq_sys_user_dept_username` (`dept_id`, `username`) );如果表已经创建完成(比如前期设计遗漏了唯一约束),可以通过ALTER TABLE语句添加唯一约束,同样支持单列和多列场景。
-- 方式1:不指定约束名(MySQL会自动生成默认约束名,不推荐) ALTER TABLE `sys_user` ADD UNIQUE KEY (`email`); -- 方式2:指定约束名(推荐,便于后续维护) ALTER TABLE `sys_user` ADD UNIQUE KEY `uq_sys_user_email` (`email`);ALTER TABLE `sys_user` ADD UNIQUE KEY `uq_sys_user_dept_username` (`dept_id`, `username`);MySQL 中,唯一约束的本质是通过唯一索引实现的,创建唯一索引(CREATE UNIQUE INDEX)和添加唯一约束在功能上完全一致,都能保证字段值的唯一性。
CREATE UNIQUE INDEX `idx_sys_user_phone_unique` ON `sys_user` (`phone`);CREATE UNIQUE INDEX `idx_sys_user_dept_username_unique` ON `sys_user` (`dept_id`, `username`);NULL值(因为 MySQL 中NULL不等于任何值,包括它自身)。| 特性 | 唯一约束(UNIQUE) | 主键(PRIMARY KEY) |
|---|---|---|
| 唯一性 | 保证字段值唯一 | 保证字段值唯一 |
| 非空性 | 允许 NULL 值(单列) | 不允许 NULL 值 |
| 一个表数量 | 可以有多个唯一约束(单列 / 多列) | 一个表只能有一个主键(可联合主键) |
| 索引类型 | 唯一索引 | 聚簇索引 |
-- 语法:ALTER TABLE 表名 DROP INDEX 约束名/索引名; ALTER TABLE `sys_user` DROP INDEX `uq_sys_user_phone`;1、“唯一约束和主键有什么区别?如果我想让手机号既非空又唯一,该怎么设置?”(答案:给phone字段同时添加NOT NULL和UNIQUE约束);
2、“我插入一条username为‘zhangsan’、dept_id为 1 的记录后,还能插入username为‘zhangsan’、dept_id为 2 的记录吗?为什么?”(答案:可以,因为是联合唯一约束,组合值不同即可);
3、“如何删除sys_user表中uq_sys_user_phone这个唯一约束?”(答案:ALTER TABLE sys_user DROP INDEX uq_sys_user_phone;)。