【重学 MySQL】六十三、唯一约束的使用

【重学 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
);

在这个示例中,usernameemail 列都被定义为唯一约束,这意味着在整个 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_idseat_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_idseat_number这两个列设置复合唯一约束,确保了同一个班级中每个学生的座位号是唯一的。这有助于维护数据的完整性和准确性。

特点

  • 同一个表可以有多个唯一约束。
  • 唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
  • 唯一性约束允许列值为空。
  • 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
  • MySQL会给唯一约束的列上默认创建一个唯一索引。

注意事项

  1. NULL 值:唯一约束允许列中存在多个 NULL 值,因为 NULL 在 SQL 中表示“未知”,所以多个未知值并不冲突。
  2. 组合唯一约束:唯一约束可以定义在多个列上,确保这些列的组合在整个表中是唯一的。
上一篇:编写内核文件,写入操作系统


下一篇:第三章 RabbitMQ安装-一、Mac RabbitMQ安装