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;
 
合理使用唯一索引可以在保证数据准确性的同时提升查询效率,但过多的索引会影响插入和更新操作的性能,需要根据实际业务场景权衡。
nat123映射怎么用?超详细步骤,外网访问内网轻松搞定
nat123域名怎么用?两种方式轻松搞定
nat123怎么用?简单几步实现内网穿透
内网穿透工具对比:nat123、花生壳与轻量新选择
远程访问内网很简单:用对工具,一“箭”穿透
ngrok下载完全指南:从入门到获取客户端
内网远程桌面软件:穿透局域网边界的数字窗口
从外网远程访问内网服务器的完整方案
Windows Server 2008端口转发完全教程:netsh命令添加/查看/删除/重置
为什么三层交换机转发比Linux服务器快?转发表硬件加速的秘密