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
);
在上面的例子中,email
和 username
列都被定义为唯一索引。这意味着:
- 不能插入重复的
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 TABLE
或CREATE UNIQUE INDEX
语句创建唯一索引。 - 唯一索引不仅用于加速查询,还用于强制数据唯一性约束。
- 唯一索引允许 NULL 值,但每个 NULL 值也被视为唯一。
- 唯一索引与主键的区别在于是否允许 NULL 值以及是否用于标识记录。
附加资源与练习
练习
- 创建一个
students
表,包含id
、student_id
和name
列,并为student_id
列添加唯一索引。 - 尝试插入重复的
student_id
值,观察 MySQL 的行为。 - 为
students
表的name
列添加唯一索引,并尝试插入两个具有相同name
值的记录。