跳到主要内容

MySQL 唯一索引

介绍

在 MySQL 中,唯一索引(Unique Index)是一种特殊的索引类型,它确保索引列中的值是唯一的。与普通索引不同,唯一索引不仅用于加速查询,还用于强制数据的唯一性约束。这意味着在唯一索引列中,不能插入重复的值。

唯一索引通常用于确保某些列(如用户邮箱、身份证号等)的唯一性,从而避免数据重复和潜在的错误。

备注

唯一索引允许 NULL 值,但每个 NULL 值也被视为唯一。因此,唯一索引列可以包含多个 NULL 值。


创建唯一索引

在 MySQL 中,可以通过以下两种方式创建唯一索引:

1. 使用 CREATE TABLE 语句

在创建表时,可以直接为某一列添加唯一索引。例如:

sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
username VARCHAR(50) UNIQUE
);

在上面的例子中,emailusername 列都被定义为唯一索引。这意味着:

  • 不能插入重复的 email 值。
  • 不能插入重复的 username 值。

2. 使用 CREATE INDEX 语句

如果表已经存在,可以使用 CREATE UNIQUE INDEX 语句为某一列添加唯一索引。例如:

sql
CREATE UNIQUE INDEX idx_email ON users(email);

这条语句为 users 表的 email 列创建了一个名为 idx_email 的唯一索引。


唯一索引的作用

1. 确保数据唯一性

唯一索引的主要作用是确保某一列或多列的值是唯一的。例如,在用户表中,通常需要确保每个用户的邮箱地址是唯一的,以避免重复注册。

2. 加速查询

与普通索引一样,唯一索引也可以加速查询。当查询条件中包含唯一索引列时,MySQL 可以快速定位到符合条件的记录。


实际案例

假设我们有一个 products 表,用于存储商品信息。每个商品都有一个唯一的商品编号(product_code),我们需要确保 product_code 列的值是唯一的。

创建表并添加唯一索引

sql
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
product_code VARCHAR(50) UNIQUE,
name VARCHAR(100),
price DECIMAL(10, 2)
);

插入数据

sql
INSERT INTO products (product_code, name, price) VALUES ('P001', 'Laptop', 1200.00);
INSERT INTO products (product_code, name, price) VALUES ('P002', 'Smartphone', 800.00);

尝试插入重复值

sql
INSERT INTO products (product_code, name, price) VALUES ('P001', 'Tablet', 500.00);

执行上述语句时,MySQL 会抛出以下错误:

ERROR 1062 (23000): Duplicate entry 'P001' for key 'product_code'

这是因为 product_code 列的唯一索引阻止了重复值的插入。


唯一索引与主键的区别

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

特性唯一索引主键
是否允许 NULL 值允许不允许
是否可以有多个一个表可以有多个唯一索引一个表只能有一个主键
是否自动创建索引
是否用于标识记录
提示

如果需要确保某一列的值唯一且不允许 NULL 值,可以考虑使用主键。


总结

  • 唯一索引用于确保某一列或多列的值是唯一的。
  • 可以通过 CREATE TABLECREATE UNIQUE INDEX 语句创建唯一索引。
  • 唯一索引不仅用于加速查询,还用于强制数据唯一性约束。
  • 唯一索引允许 NULL 值,但每个 NULL 值也被视为唯一。
  • 唯一索引与主键的区别在于是否允许 NULL 值以及是否用于标识记录。

附加资源与练习

练习

  1. 创建一个 students 表,包含 idstudent_idname 列,并为 student_id 列添加唯一索引。
  2. 尝试插入重复的 student_id 值,观察 MySQL 的行为。
  3. students 表的 name 列添加唯一索引,并尝试插入两个具有相同 name 值的记录。

进一步学习