跳到主要内容

SQL 唯一索引

在数据库中,索引是一种用于加速数据检索的数据结构。唯一索引是索引的一种特殊类型,它不仅加速查询,还确保索引列中的值是唯一的。这意味着唯一索引列中不允许出现重复值。

什么是唯一索引?

唯一索引是一种约束,它确保表中的某一列或一组列的值是唯一的。与普通索引不同,唯一索引不仅用于提高查询性能,还用于强制数据的唯一性。如果尝试插入或更新数据时违反了唯一性约束,数据库将抛出错误。

备注

唯一索引可以应用于单列或多列。对于多列的唯一索引,组合值必须是唯一的,但单个列的值可以重复。

创建唯一索引

在 SQL 中,可以使用 CREATE UNIQUE INDEX 语句创建唯一索引。以下是创建唯一索引的基本语法:

sql
CREATE UNIQUE INDEX index_name
ON table_name (column1, column2, ...);

示例:创建单列唯一索引

假设我们有一个名为 users 的表,其中包含 email 列。我们希望确保每个用户的电子邮件地址是唯一的。可以使用以下 SQL 语句创建唯一索引:

sql
CREATE UNIQUE INDEX idx_email
ON users (email);

示例:创建多列唯一索引

如果我们需要确保 users 表中的 first_namelast_name 组合是唯一的,可以使用以下 SQL 语句:

sql
CREATE UNIQUE INDEX idx_full_name
ON users (first_name, last_name);

唯一索引的实际应用

场景 1:防止重复数据

假设我们有一个 products 表,其中包含 product_code 列。我们希望确保每个产品的代码是唯一的。通过创建唯一索引,可以防止插入重复的产品代码:

sql
CREATE UNIQUE INDEX idx_product_code
ON products (product_code);

如果尝试插入重复的 product_code,数据库将返回错误:

sql
INSERT INTO products (product_code, product_name)
VALUES ('P123', 'Product A');

-- 尝试插入重复的 product_code
INSERT INTO products (product_code, product_name)
VALUES ('P123', 'Product B');

输出:

ERROR: duplicate key value violates unique constraint "idx_product_code"

场景 2:加速唯一性检查

唯一索引不仅用于防止重复数据,还可以加速唯一性检查。例如,在用户注册时,我们需要检查电子邮件地址是否已被使用。通过唯一索引,数据库可以快速查找并确定是否存在重复值。

唯一索引与主键的区别

唯一索引和主键(Primary Key)都用于确保数据的唯一性,但它们有一些关键区别:

  • 主键:每个表只能有一个主键,主键列不能包含 NULL 值。
  • 唯一索引:一个表可以有多个唯一索引,唯一索引列可以包含 NULL 值(但每个 NULL 值被视为唯一)。
提示

如果某列既需要唯一性约束,又需要作为表的主键,通常直接使用主键约束而不是唯一索引。

删除唯一索引

如果需要删除唯一索引,可以使用 DROP INDEX 语句:

sql
DROP INDEX index_name;

例如,删除之前创建的 idx_email 索引:

sql
DROP INDEX idx_email;

总结

唯一索引是数据库设计中非常重要的工具,它不仅提高了查询性能,还确保了数据的唯一性。通过本文的学习,你应该已经掌握了如何创建、使用和删除唯一索引,并了解了它与主键的区别。

警告

在使用唯一索引时,请确保理解其约束条件,避免因违反唯一性约束而导致的数据插入或更新失败。

附加资源与练习

练习 1

创建一个名为 students 的表,包含 student_idemail 列。为 email 列创建唯一索引,并尝试插入重复的电子邮件地址以验证唯一性约束。

练习 2

students 表中,为 student_id 列创建主键约束,并为 email 列创建唯一索引。比较两者的行为差异。

附加资源

通过实践和深入学习,你将更好地掌握唯一索引的使用场景和优化技巧。