前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【重学 MySQL】六十三、唯一约束的使用

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

作者头像
用户11332765
发布2024-10-28 17:28:45
840
发布2024-10-28 17:28:45
举报
文章被收录于专栏:编程
【重学 MySQL】六十三、唯一约束的使用

在 MySQL 中,唯一约束(UNIQUE Constraint)用于确保数据库表中的一列或多列的数据在整个表中是唯一的,即不允许有重复的值。唯一约束不仅可以在创建表时定义,也可以在表创建后通过修改表结构来添加。

创建表时定义唯一约束

在创建表时,可以通过 CREATE TABLE 语句中的 UNIQUE 关键字来定义唯一约束。

示例

代码语言:javascript
复制
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 列添加唯一约束:

代码语言:javascript
复制
ALTER TABLE employees
ADD CONSTRAINT unique_phone UNIQUE (phone_number);

或者,如果不使用命名约束(即匿名约束),可以简单地写为:

代码语言:javascript
复制
ALTER TABLE employees
ADD UNIQUE (phone_number);

删除唯一约束

要删除唯一约束,可以使用 ALTER TABLE 语句中的 DROP INDEX 子句(对于匿名约束)或 DROP CONSTRAINT 子句(对于命名约束)。

示例

假设我们有一个命名唯一约束 unique_phone,我们可以这样删除它:

代码语言:javascript
复制
ALTER TABLE employees
DROP CONSTRAINT unique_phone;

对于匿名唯一约束,我们需要知道约束的名称(MySQL 会在内部为匿名约束生成一个名称,通常是以 unique_ 开头,后跟列名和一些随机字符)。可以通过查询 information_schema 数据库中的 TABLE_CONSTRAINTS 表来找到这个名称。

代码语言:javascript
复制
SELECT CONSTRAINT_NAME
FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = 'your_database_name'
  AND TABLE_NAME = 'employees'
  AND CONSTRAINT_TYPE = 'UNIQUE';

找到约束名称后,可以使用 DROP INDEX 来删除它:

代码语言:javascript
复制
ALTER TABLE employees
DROP INDEX unique_phone_xxxx;  -- 替换为实际的约束名称

复合唯一约束

复合唯一约束是指在数据库中,对两个或多个列的组合设置唯一性约束,以确保这些列的组合在表中是唯一的。

案例背景

假设有一个名为students的学生表,用于存储学生的学号、姓名、班级编号和座位号。为了确保同一个班级中每个学生的座位号是唯一的,需要对班级编号座位号这两个列设置复合唯一约束。

创建表并添加复合唯一约束

可以使用以下SQL语句来创建students表,并添加复合唯一约束:

代码语言:javascript
复制
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这两个列的组合在表中是唯一的。

插入数据测试

现在,可以尝试插入一些数据来测试复合唯一约束的效果:

代码语言:javascript
复制
-- 插入数据成功
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. 组合唯一约束:唯一约束可以定义在多个列上,确保这些列的组合在整个表中是唯一的。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【重学 MySQL】六十三、唯一约束的使用
  • 创建表时定义唯一约束
    • 示例
    • 在已存在的表上添加唯一约束
      • 示例
      • 删除唯一约束
        • 示例
        • 复合唯一约束
          • 案例背景
            • 创建表并添加复合唯一约束
              • 插入数据测试
                • 总结
                • 特点
                • 注意事项
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档