MySQL 中的唯一索引(UNIQUE INDEX)是一种用于确保数据唯一性的索引,可以应用于单列或多列,与普通索引不同的是,唯一索引不仅能够提高查询效率,还能强制数据的唯一性,以下是关于 MySQL 唯一索引的详细介绍:
基本使用
1、创建单列唯一索引:
```sql
ALTER TABLE sc ADD UNIQUE (name);
```
2、创建多列唯一索引:
```sql
ALTER TABLE sc ADD UNIQUE KEYname_score
(name
,score
);
```
3、删除唯一索引:
```sql
ALTER TABLE sc DROP INDEX name;
```
作用
1、确保数据唯一性:
单列唯一值通常用作主键,而多列唯一值则常用于防止重复购买等场景。
一个用户只能购买一件商品,通过将用户 ID 和商品 ID 设置为唯一索引,可以避免重复购买。
2、提高查询速度:
使用唯一索引后,查询速度显著提升,从原来的数秒缩短到几乎可以忽略不计的时间。
唯一索引与主键索引的区别
1、允许空值:
唯一索引允许列为空值,但主键索引不允许。
2、应用范围:
唯一索引可以应用于一个或多个列,而主键索引仅能应用于一个列。
3、外键引用:
主键的目的是让外键来引用,而唯一索引主要用于确保数据唯一性。
4、数量限制:
一个表只能有一个主键索引,但可以有多个唯一索引。
避免唯一键冲突的策略
1、使用 INSERT IGNORE 语句:
当插入的数据已经存在时,会忽略该数据。
```sql
INSERT IGNORE INTO t (c1, c2, c3, c4, c5) VALUES ('1', '1', '1', '1', '1');
```
2、使用 REPLACE INTO 语句:
如果发现重复数据,先删除再插入新数据。
```sql
REPLACE INTO t (c1, c2, c3, c4, c5) VALUES ('1', '1', '1', '1', '1');
```
示例代码
1、创建数据表:
```sql
CREATE TABLE t (
c1 CHAR(1) NOT NULL,
c2 CHAR(1) NOT NULL,
c3 CHAR(1) NOT NULL,
c4 CHAR(1) NOT NULL,
c5 CHAR(1) NOT NULL
) ENGINE = MyISAM CHARSET utf8;
```
2、添加数据:
```sql
INSERT INTO t VALUES ('1', '1', '1', '1', '1'), ('2', '2', '2', '2', '2'), ('3', '3', '3', '3', '3'), ('4', '4', '4', '4', '4'), ('5', '5', '5', '5', '5');
```
3、创建唯一索引:
```sql
ALTER TABLE t ADD UNIQUE KEY name_score (c2, c3);
```
4、写入重复数据失败:
```sql
INSERT INTO t (c1, c2, c3, c4, c5) VALUES ('1', '1', '1', '1', '1'); Error: Duplicate entry for key 'name_score'
```
FAQs
问题1:为什么在唯一索引中允许 NULL 值?
答:MySQL 的设计允许在唯一索引中的列包含多个 NULL 值,因为 NULL 值被视为未知值,它们并不违反唯一性约束,在实际应用中,如果需要确保某列的值完全唯一,建议在应用程序逻辑中加以控制。
问题2:如何避免在插入数据时出现唯一键冲突?
答:为了避免唯一键冲突,可以使用以下策略:
1、INSERT IGNORE 语句:当插入的数据已经存在时,会忽略该数据。
2、REPLACE INTO 语句:如果发现重复数据,先删除再插入新数据。
通过合理设置和使用唯一索引,可以有效确保数据的一致性和完整性,同时提高数据库查询性能。