ESP32驱动S90舵机保姆级教程:从PWM原理到库函数封装,附完整代码
2026/7/1 4:44:05
唯一索引是MySQL中保证数据完整性的重要工具,它强制要求索引列的值必须唯一(允许NULL值,但多NULL值会被视为不同值)。与主键索引不同,唯一索引允许存在多个,且不隐含非空约束。典型应用场景包括:
语法模板
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. 性能影响评估
4. 特殊场景处理
INSERT IGNOREINSERTIGNOREINTOusers(username)VALUES('john');CREATETABLElogs(idINT,event_dateDATE,UNIQUE(id,event_date)-- 仅当event_date在最近30天时生效)PARTITIONBYRANGECOLUMNS(event_date);ALTERTABLEarticlesADDUNIQUE(title(50));-- 仅索引前50字符OPTIMIZE TABLE重建索引完整示例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分析索引使用效率,持续优化索引策略。