news 2026/2/4 20:27:50

MySQL如何加唯一索引

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL如何加唯一索引
一、唯一索引的核心价值

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

  • 用户邮箱/手机号唯一验证
  • 订单号防重复
  • 商品SKU编码唯一性约束
二、建表时添加唯一索引

语法模板

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

实战示例

CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,-- 单列唯一索引emailVARCHAR(100)NOTNULL,phoneVARCHAR(20),INDEXidx_email_phone(email,phone)UNIQUE-- 组合唯一索引);

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

三、建表后添加唯一索引

方法1:ALTER TABLE(推荐)

ALTERTABLEproductsADDUNIQUEuk_product_sku(sku);-- 单列索引ALTERTABLEordersADDUNIQUEuk_order_user_time(user_id,order_time);-- 组合索引

方法2:CREATE INDEX

CREATEUNIQUEINDEXidx_unique_usernameONcustomers(username);
四、进阶操作与注意事项

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

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

-- 查找重复数据SELECTcol,COUNT(*)FROMtable_nameGROUPBYcolHAVINGCOUNT(*)>1;-- 删除重复记录(保留最新)DELETEt1FROMtable_name t1INNERJOINtable_name t2WHEREt1.id>t2.idANDt1.col=t2.col;

3. 性能影响评估

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

4. 特殊场景处理

  • 忽略重复插入:使用INSERT IGNORE
    INSERTIGNOREINTOusers(username)VALUES('john');
  • 条件唯一索引(MySQL 8.0+):
    CREATETABLElogs(idINT,event_dateDATE,UNIQUE(id,event_date)-- 仅当event_date在最近30天时生效)PARTITIONBYRANGECOLUMNS(event_date);
五、最佳实践建议
  1. 前缀索引优化:对长文本列使用前缀索引
    ALTERTABLEarticlesADDUNIQUE(title(50));-- 仅索引前50字符
  2. 避免过度索引:高频写入表建议不超过5个索引
  3. 监控索引碎片:定期执行OPTIMIZE TABLE重建索引
  4. 联合索引顺序:将区分度高的列放在组合索引左侧

完整示例SQL

-- 创建商品表并添加唯一索引CREATETABLEproducts(idINTAUTO_INCREMENTPRIMARYKEY,skuVARCHAR(20)NOTNULL,nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,CONSTRAINTuk_product_skuUNIQUE(sku)-- 命名约束)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;-- 添加组合唯一索引(订单号+用户ID)ALTERTABLEordersADDUNIQUEuk_order_user(order_number,user_id);

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 9:55:36

百考通:海量源码资源库,一站式解锁您的项目开发全链路

在当今快速发展的数字时代,无论是学生、开发者、工程师,还是企业项目负责人,都面临着同一个核心挑战:如何高效获取可靠、优质的技术资源,从而加速项目开发、提升系统质量、降低试错成本。从PLC控制、电路图纸到Web开发…

作者头像 李华
网站建设 2026/2/4 7:44:04

爆肝7分钟,搞懂AI Agent!大模型时代的编程新范式,小白也能秒懂

一、前言 AI Agent(人工智能代理)是上半年一个火热的话题。笔者最近对相关概念进行了学习与研究,期间也通过智能体开发平台成功搭建了一些有趣的Agent。所以计划通过本篇文章,跟大家分享笔者对于AI Agent的些许理解。 二、AI Ag…

作者头像 李华
网站建设 2026/2/4 0:12:55

真心不骗你!千笔ai写作,本科生论文救星!

真心不骗你!千笔ai写作,本科生论文救星!你是否也曾为论文的选题发愁?是否在深夜里对着空白文档无从下笔?是否反复修改却依然对结果不满意?本科生的论文写作,常常被格式、查重、内容逻辑等问题困扰。而如今&…

作者头像 李华
网站建设 2026/2/4 9:40:14

基于Python的车牌识别系统设计与实现开题任务书

目录 研究背景与意义系统设计目标关键技术方案实验与验证预期成果进度安排参考文献 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 研究背景与意义 车牌识别系统是智能交通领域的核心技术,广…

作者头像 李华
网站建设 2026/2/4 7:37:55

AI应用中台+解决方案架构:赋能Java企业智能化转型

在大架构驱动的 AI 能力进化模型技术浪潮下,越来越多的Java企业开始探索智能化转型路径。但在实践过程中,多模型对接协议不统一、老系统改造难度大、AI能力与业务场景脱节、团队转型成本居高不下等痛点,成为阻碍企业落地AI的一道道坎。 想要…

作者头像 李华
网站建设 2026/2/4 15:00:00

基于springboot的宠物领养管理系统-计算机毕业设计源码+LW无文档

基于SpringBoot的宠物领养管理系统 摘要:宠物领养在当下社会逐渐成为一种常见且有意义的行为,然而传统领养管理方式存在诸多弊端。本文探讨基于SpringBoot的宠物领养管理系统,阐述其研究背景意义、需求分析及功能设计,旨在借助信息…

作者头像 李华