SQL - 唯一索引:数据完整性的关键

你好,有抱负的数据库爱好者们!今天,我们将踏上一段激动人心的旅程,探索 SQL 唯一索引的世界。作为你友好邻里的计算机科学老师,我将以过去 15 年在课堂上的同样热情来引导你了解这个主题。所以,拿起你的虚拟记事本,让我们一起深入探讨!

SQL - Unique Index

什么是 SQL 唯一索引?

想象你正在组织一个庞大的图书馆。你希望确保没有两本书具有相同的 ISBN 号码。这在数据库中,唯一索引的作用本质上就是这样 - 它确保表中的两行在特定列或列集中具有相同的值。

唯一索引的基础

SQL 中的唯一索引是一种特殊的索引,它强制执行表中一个或多个列值的唯一性。这就像给你的每个宠物取一个独特的名字 - 没有两个宠物可以拥有相同的名字!

让我们从一个简单的例子开始:

CREATE TABLE students (
student_id INT PRIMARY KEY,
email VARCHAR(100),
name VARCHAR(50)
);

CREATE UNIQUE INDEX idx_student_email
ON students (email);

在这个例子中,我们创建了一个名为 students 的表,然后在该表的 email 列上添加了一个唯一索引。这确保了没有两个学生可以有相同的电子邮件地址。

为什么使用唯一索引?

  1. 数据完整性: 它们防止重复数据被插入到你的表中。
  2. 性能: 它们可以加速搜索特定唯一值的查询。
  3. 约束替代: 在某些情况下,它们可以替代唯一约束。

创建唯一索引

创建唯一索引有几种方法。让我们来探索它们!

方法 1:在创建表时

你可以在首次创建表时创建唯一索引:

CREATE TABLE products (
product_id INT PRIMARY KEY,
product_code VARCHAR(20) UNIQUE,
product_name VARCHAR(100)
);

在这里,product_code 将自动为其创建唯一索引。

方法 2:在创建表后

你还可以将唯一索引添加到现有表中:

CREATE UNIQUE INDEX idx_product_name
ON products (product_name);

这在我们 products 表的 product_name 列上创建了一个唯一索引。

插入重复值

现在,如果我们尝试插入或更新一个已经在我们唯一索引中存在的值的行,会发生什么?让我们找出答案!

INSERT INTO products (product_id, product_code, product_name)
VALUES (1, 'ABC123', 'Super Widget');

INSERT INTO products (product_id, product_code, product_name)
VALUES (2, 'ABC123', 'Mega Gadget');

第一个插入操作将正常工作,但第二个将失败,因为 'ABC123' 已经作为 product_code 使用了。SQL 将抛出一个错误,保护我们的数据完整性。

在多个字段上创建唯一索引

有时,我们需要在列组合上保持唯一性。这时,多列唯一索引就派上用场了!

CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
product_id INT
);

CREATE UNIQUE INDEX idx_customer_date_product
ON orders (customer_id, order_date, product_id);

这个索引确保客户在同一天不能订购同一产品两次。这就像确保你的朋友不会意外地为同一场电影购买两张票!

现实世界示例

假设我们正在构建一个学校管理系统。我们希望确保学生在同一学期内不能重复选修同一课程:

CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
semester VARCHAR(20),
grade CHAR(1)
);

CREATE UNIQUE INDEX idx_student_course_semester
ON enrollments (student_id, course_id, semester);

现在,如果我们尝试将学生报名他们这个学期已经在修的课程,SQL 会礼貌地拒绝:

INSERT INTO enrollments (enrollment_id, student_id, course_id, semester)
VALUES (1, 101, 'CS101', 'Fall 2023');

-- 这个操作会成功

INSERT INTO enrollments (enrollment_id, student_id, course_id, semester)
VALUES (2, 101, 'CS101', 'Fall 2023');

-- 这个操作会因为唯一索引而失败

唯一索引方法

以下是我们讨论的创建唯一索引方法的总结表:

方法 描述 示例
表创建 在创建表时定义唯一列 CREATE TABLE students (id INT PRIMARY KEY, email VARCHAR(100) UNIQUE);
修改表 向现有表添加唯一约束 ALTER TABLE students ADD CONSTRAINT uc_email UNIQUE (email);
创建索引 在现有表上创建单独的唯一索引 CREATE UNIQUE INDEX idx_email ON students (email);

结论

亲爱的学生们,以上就是我们要说的内容!我们一起穿越了 SQL 唯一索引的土地,从基本概念到在多个字段上创建它们。记住,唯一索引就像独家俱乐部的保镖 - 它们确保只有正确的数据进入,保持你的数据库干净整洁。

在你继续你的 SQL 冒险时,请记住,唯一索引是强大的工具,但请明智地使用它们。过多的索引可能会减慢你的数据库插入和更新速度。这就像找到完美的咖啡编码比例一样,在深夜编码期间找到完美的平衡!

现在,去创建一些独特而出色的数据库吧!记住,在 SQL 的世界里,独特性永远时尚。快乐编码!

Credits: Image by storyset