【重学 MySQL】六十三、唯一约束的使用
- 创建表时定义唯一约束
- 示例
- 在已存在的表上添加唯一约束
- 示例
- 删除唯一约束
- 示例
- 复合唯一约束
- 案例背景
- 创建表并添加复合唯一约束
- 插入数据测试
- 总结
- 特点
- 注意事项
在 MySQL 中,唯一约束(UNIQUE Constraint)用于确保数据库表中的一列或多列的数据在整个表中是唯一的,即不允许有重复的值。唯一约束不仅可以在创建表时定义,也可以在表创建后通过修改表结构来添加。
创建表时定义唯一约束
在创建表时,可以通过 CREATE TABLE
语句中的 UNIQUE
关键字来定义唯一约束。
示例
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) UNIQUE,
password VARCHAR(100) NOT NULL
);
在这个示例中,username
和 email
列都被定义为唯一约束,这意味着在整个 users
表中,这两个字段的值必须是唯一的。
在已存在的表上添加唯一约束
如果表已经存在,可以使用 ALTER TABLE
语句来添加唯一约束。
示例
假设有一个已经存在的表 employees
,我们想为 phone_number
列添加唯一约束:
ALTER TABLE employees
ADD CONSTRAINT unique_phone UNIQUE (phone_number);
或者,如果不使用命名约束(即匿名约束),可以简单地写为:
ALTER TABLE employees
ADD UNIQUE (phone_number);
删除唯一约束
要删除唯一约束,可以使用 ALTER TABLE
语句中的 DROP INDEX
子句(对于匿名约束)或 DROP CONSTRAINT
子句(对于命名约束)。
示例
假设我们有一个命名唯一约束 unique_phone
,我们可以这样删除它:
ALTER TABLE employees
DROP CONSTRAINT unique_phone;
对于匿名唯一约束,我们需要知道约束的名称(MySQL 会在内部为匿名约束生成一个名称,通常是以 unique_
开头,后跟列名和一些随机字符)。可以通过查询 information_schema
数据库中的 TABLE_CONSTRAINTS
表来找到这个名称。
SELECT CONSTRAINT_NAME
FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'employees'
AND CONSTRAINT_TYPE = 'UNIQUE';
找到约束名称后,可以使用 DROP INDEX
来删除它:
ALTER TABLE employees
DROP INDEX unique_phone_xxxx; -- 替换为实际的约束名称
复合唯一约束
复合唯一约束是指在数据库中,对两个或多个列的组合设置唯一性约束,以确保这些列的组合在表中是唯一的。
案例背景
假设有一个名为students
的学生表,用于存储学生的学号、姓名、班级编号和座位号。为了确保同一个班级中每个学生的座位号是唯一的,需要对班级编号
和座位号
这两个列设置复合唯一约束。
创建表并添加复合唯一约束
可以使用以下SQL语句来创建students
表,并添加复合唯一约束:
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 学号,主键
name VARCHAR(50), -- 姓名
class_id INT, -- 班级编号
seat_number INT, -- 座位号
UNIQUE KEY unique_class_seat (class_id, seat_number) -- 复合唯一约束
);
在上述SQL语句中,unique_class_seat
是复合唯一约束的名称,它确保了class_id
和seat_number
这两个列的组合在表中是唯一的。
插入数据测试
现在,可以尝试插入一些数据来测试复合唯一约束的效果:
-- 插入数据成功
INSERT INTO students (student_id, name, class_id, seat_number) VALUES (1, '张三', 101, 1);
INSERT INTO students (student_id, name, class_id, seat_number) VALUES (2, '李四', 101, 2);
INSERT INTO students (student_id, name, class_id, seat_number) VALUES (3, '王五', 102, 1);
-- 插入重复数据失败,因为班级编号101和座位号1的组合已经存在
INSERT INTO students (student_id, name, class_id, seat_number) VALUES (4, '赵六', 101, 1);
在上述插入操作中,前三个INSERT
语句都成功执行,因为插入的数据没有违反复合唯一约束。而最后一个INSERT
语句则失败,因为尝试插入的班级编号101
和座位号1
的组合已经存在于表中,违反了复合唯一约束。
总结
复合唯一约束是一种非常有用的数据库约束,它可以确保多个列的组合在表中是唯一的。在上面的案例中,通过对class_id
和seat_number
这两个列设置复合唯一约束,确保了同一个班级中每个学生的座位号是唯一的。这有助于维护数据的完整性和准确性。
特点
- 同一个表可以有多个唯一约束。
- 唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
- 唯一性约束允许列值为空。
- 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
- MySQL会给唯一约束的列上默认创建一个唯一索引。
注意事项
- NULL 值:唯一约束允许列中存在多个 NULL 值,因为 NULL 在 SQL 中表示“未知”,所以多个未知值并不冲突。
- 组合唯一约束:唯一约束可以定义在多个列上,确保这些列的组合在整个表中是唯一的。