唯一索引用于确保列或列组合数据的唯一性,防止重复值插入。1. 创建方式包括建表时定义(如UNIQUE KEY uk_email (email))、对已有表添加(ALTER table ADD UNIQUE)或使用CREATE UNIQUE INDEX。2. 支持复合唯一索引,如(product_id, spec)组合唯一。3. 允许NULL值(InnoDB中多个NULL不冲突),但重复非空值会触发“Duplicate entry”错误。4. 可通过INSERT IGNORE忽略冲突或ON DUPLICATE KEY UPDATE更新数据。5. 虽略微影响写入性能,但能有效保障数据完整性。合理应用可提升数据质量。

在mysql中使用唯一索引,主要是为了确保某列或多个列的组合数据不重复,从而保证数据的完整性。唯一索引不仅能够提升查询效率,还能防止插入或更新时出现重复值。
什么是唯一索引
唯一索引(Unique Index)是一种数据库约束,它强制要求索引列中的所有值都必须是唯一的。允许有NULL值,但每个NULL只允许出现一次(在某些存储引擎中允许多个NULL,具体取决于实现)。
创建唯一索引的方法
可以在建表时定义,也可以对已有表添加唯一索引。
- 建表时创建唯一索引:
例如,创建一个用户表,要求邮箱不能重复:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(100) NOT NULL, username VARCHAR(50), UNIQUE KEY uk_email (email) );
- 对已有表添加唯一索引:
使用ALTER TABLE语句添加:
ALTER TABLE users ADD UNIQUE KEY uk_username (username);
- 使用CREATE UNIQUE INDEX语法:
这种方式更直观地表达创建索引的操作:
CREATE UNIQUE INDEX uk_email ON users(email);
复合唯一索引
如果需要多个字段组合起来唯一,可以创建复合唯一索引。
比如,要求同一个订单中,商品和规格不能重复:
CREATE TABLE order_items ( order_id INT, product_id INT, spec VARCHAR(50), quantity INT, UNIQUE KEY uk_product_spec (product_id, spec) );
此时(product_id, spec)的组合必须唯一,单独某个字段可以重复。
唯一索引的注意事项
使用唯一索引时需要注意以下几点:
- 插入或更新数据时,如果违反唯一性约束,MySQL会报错:Duplicate entry ‘xxx’ for key ‘xxx’。
- 唯一索引允许有一个NULL值(InnoDB引擎中,多个NULL被视为不重复,这一点与主键不同)。
- 唯一索引会影响插入和更新性能,因为每次都需要检查重复值,但在大多数场景下,这种代价是值得的。
- 可以通过IGNORE关键字忽略重复数据(谨慎使用):
INSERT IGNORE INTO users(email, username) VALUES ('test@example.com', 'test'); - 或者使用ON DUPLICATE KEY UPDATE进行冲突处理:
INSERT INTO users(email, username) VALUES ('test@example.com', 'test') ON DUPLICATE KEY UPDATE username = VALUES(username);
基本上就这些。合理使用唯一索引能有效防止脏数据,提升数据质量。只要明确业务上的唯一性需求,就可以对应建立唯一索引,操作也不复杂,但容易忽略细节导致报错,注意字段类型和NULL值处理即可。