mysql唯一索引,保证数据准确性的同时提升查询效率

首页 2025-09-22 10:20:54



MySQL 唯一索引(Unique Index)是一种约束性索引,用于确保表中指定列(或列组合)的值具有唯一性,防止重复数据插入。它既可以提高查询性能,又能保证数据完整性。

唯一索引的特点

  • 被索引的列 / 列组合不能有重复值(但可以有多个 NULL 值,因为 NULL 被视为未知值,彼此不相等)
  • 一张表可以有多个唯一索引
  • 唯一索引会自动对插入 / 更新操作进行唯一性校验

如何创建唯一索引

1. 创建表时定义唯一索引

sql
-- 单列唯一索引
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    UNIQUE INDEX idx_email (email)  -- 为email列创建唯一索引
);

-- 多列唯一索引(组合唯一索引)
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    order_date DATE,
    UNIQUE INDEX idx_product_customer (product_id, customer_id)  -- 两列组合唯一
);
 

2. 对已有表添加唯一索引

sql
-- 单列唯一索引
ALTER TABLE users 
ADD UNIQUE INDEX idx_username (username);

-- 或使用 CREATE INDEX 语法
CREATE UNIQUE INDEX idx_username ON users (username);
 

唯一索引与主键的区别

特性 唯一索引 主键
数量限制 一张表可以有多个 一张表只能有一个
NULL 值 允许 NULL 值 不允许 NULL 值
自动创建 需手动创建 表创建时可自动创建
主要作用 确保数据唯一性 + 提升查询性能 唯一标识记录 + 确保唯一性 + 提升查询性能

唯一索引的使用场景

  1. 用户表中的邮箱、用户名等需唯一标识的字段
  2. 订单表中防止同一用户对同一商品重复下单的组合字段
  3. 系统配置表中确保参数键名不重复的配置项

唯一索引冲突处理

当插入或更新数据违反唯一索引约束时,MySQL 会抛出错误:
plaintext
ERROR 1062 (23000): Duplicate entry 'xxx' for key 'idx_email'
 
处理方式:
  1. 使用 INSERT IGNORE 忽略重复记录:
    sql
    INSERT IGNORE INTO users (username, email) VALUES ('user1', 'a@example.com');
    
     
     
  2. 使用 ON DUPLICATE KEY UPDATE 处理重复记录:
    sql
    INSERT INTO users (username, email) 
    VALUES ('user1', 'a@example.com')
    ON DUPLICATE KEY UPDATE username = 'user1_updated';
    
     
     

查看和删除唯一索引

sql
-- 查看表中的索引
SHOW INDEX FROM users;

-- 删除唯一索引
ALTER TABLE users DROP INDEX idx_email;
 
合理使用唯一索引可以在保证数据准确性的同时提升查询效率,但过多的索引会影响插入和更新操作的性能,需要根据实际业务场景权衡。
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道