MySQL添加唯一索引的常见方法

 更新时间:2026年02月01日 08:16:42   作者:detayun  
唯一索引是MySQL中保证数据完整性的重要工具,它强制要求索引列的值必须唯一,,与主键索引不同,唯一索引允许存在多个,且不隐含非空约束,本文给大家介绍了关于MySQL添加唯一索引的常见方法,需要的朋友可以参考下

一、唯一索引的核心价值

唯一索引是MySQL中保证数据完整性的重要工具,它强制要求索引列的值必须唯一(允许NULL值,但多NULL值会被视为不同值)。与主键索引不同,唯一索引允许存在多个,且不隐含非空约束。典型应用场景包括:

  • 用户邮箱/手机号唯一验证
  • 订单号防重复
  • 商品SKU编码唯一性约束

二、建表时添加唯一索引

语法模板

CREATE TABLE table_name (
    column1 datatype UNIQUE,  -- 单列唯一索引
    column2 datatype,
    ...,
    UNIQUE (col_a, col_b)     -- 多列组合唯一索引
);

实战示例

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,  -- 单列唯一索引
    email VARCHAR(100) NOT NULL,
    phone VARCHAR(20),
    INDEX idx_email_phone (email, phone) UNIQUE  -- 组合唯一索引
);

效果验证
插入重复用户名或(email+phone)组合时,MySQL将抛出ERROR 1062 (23000): Duplicate entry错误。

三、建表后添加唯一索引

方法1:ALTER TABLE(推荐)

ALTER TABLE products 
ADD UNIQUE uk_product_sku (sku);  -- 单列索引

ALTER TABLE orders 
ADD UNIQUE uk_order_user_time (user_id, order_time);  -- 组合索引

方法2:CREATE INDEX

CREATE UNIQUE INDEX idx_unique_username ON customers(username);

四、进阶操作与注意事项

1. 索引命名规范
建议使用前缀uk_(Unique Key)或uniq_开头,如uk_user_email,便于维护。

2. 处理冲突数据
添加唯一索引前,需先清理重复数据:

-- 查找重复数据
SELECT col, COUNT(*) 
FROM table_name 
GROUP BY col 
HAVING COUNT(*) > 1;

-- 删除重复记录(保留最新)
DELETE t1 
FROM table_name t1
INNER JOIN table_name t2 
WHERE t1.id > t2.id AND t1.col = t2.col;

3. 性能影响评估

  • 写操作性能下降(约10-30%)
  • 查询速度提升(尤其在WHERE/ORDER BY场景)
  • 索引占用存储空间(约表大小的1.2-1.5倍)

4. 特殊场景处理

  • 忽略重复插入:使用INSERT IGNORE
INSERT IGNORE INTO users (username) VALUES ('john');
  • 条件唯一索引(MySQL 8.0+):
CREATE TABLE logs (
    id INT,
    event_date DATE,
    UNIQUE (id, event_date)  -- 仅当event_date在最近30天时生效
) PARTITION BY RANGE COLUMNS(event_date);

五、最佳实践建议

  1. 前缀索引优化:对长文本列使用前缀索引
ALTER TABLE articles ADD UNIQUE (title(50));  -- 仅索引前50字符
  1. 避免过度索引:高频写入表建议不超过5个索引
  2. 监控索引碎片:定期执行OPTIMIZE TABLE重建索引
  3. 联合索引顺序:将区分度高的列放在组合索引左侧

完整示例SQL

-- 创建商品表并添加唯一索引
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sku VARCHAR(20) NOT NULL,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT uk_product_sku UNIQUE (sku)  -- 命名约束
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 添加组合唯一索引(订单号+用户ID)
ALTER TABLE orders ADD UNIQUE uk_order_user (order_number, user_id);

总结

MySQL唯一索引是保障数据一致性的重要防线。通过合理的索引设计,可以在保证数据质量的同时提升查询性能。实际操作中需平衡读写性能、存储空间和业务需求,定期使用EXPLAIN分析索引使用效率,持续优化索引策略。

以上就是MySQL添加唯一索引的常见方法的详细内容,更多关于MySQL添加唯一索引的资料请关注脚本之家其它相关文章!

相关文章

  • 面试提问mysql一张表到底能存多少数据

    面试提问mysql一张表到底能存多少数据

    这篇文章主要为大家介绍了面试提问mysql一张表到底能存多少数据的问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • mysql使用from与join两表查询的区别总结

    mysql使用from与join两表查询的区别总结

    这篇文章主要给大家介绍了关于mysql使用from与join两表查询的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Mysql之DELETE操作对应的undo日志方式

    Mysql之DELETE操作对应的undo日志方式

    InnoDB通过正常记录链表和垃圾链表管理数据页,删除记录先标记为deletemark,后由purge线程移入垃圾链表回收空间,PAGE_FREE指向垃圾链表头,PAGE_GARBAGE记录可重用空间大小,Undo日志保存trx_id和roll_pointer,用于版本控制和回滚
    2025-08-08
  • MySQL数据类型全解析

    MySQL数据类型全解析

    这篇文章主要介绍了MySQL数据类型的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2021-01-01
  • MySQL数据库运维之数据恢复的方法

    MySQL数据库运维之数据恢复的方法

    本篇文章主要介绍了MySQL数据库运维之数据恢复的方法,此处总结一下恢复方案,并结合数据库的二进制日志做下数据恢复的示范。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 一次Mysql使用IN大数据量的优化记录

    一次Mysql使用IN大数据量的优化记录

    这篇文章主要给大家介绍了关于Mysql使用IN大数据量的优化的实战记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 分享几道关于MySQL索引的重点面试题

    分享几道关于MySQL索引的重点面试题

    这篇文章主要给大家介绍了几道关于MySQL索引的重点面试题,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • MySQL中根据出生日期计算年龄两种方法

    MySQL中根据出生日期计算年龄两种方法

    使用SQL语句计算年龄,在事务处理和日期计算中,较为常见,下面这篇文章主要给大家介绍了关于MySQL中根据出生日期计算年龄的两种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • MySQL事务保证数据一致性的核心讲解

    MySQL事务保证数据一致性的核心讲解

    这篇文章主要介绍了MySQL事务实现保证数据一致性的原理,事务不是万能药,它不能解决所有数据问题,比如硬件物理损坏需要靠备份恢复,但它是保障数据一致性的基础,没有事务,任何涉及多步操作的数据场景,都可能出现翻车风险,需要的朋友可以参考下
    2025-10-10
  • MySQL中binlog+dump备份还原详细教程

    MySQL中binlog+dump备份还原详细教程

    MySQL备份是指将MySQL数据库中的数据进行备份,以便在需要的时候能够恢复数据,下面这篇文章主要给大家介绍了关于MySQL中binlog+dump备份还原的相关资料,需要的朋友可以参考下
    2023-05-05

最新评论