«

MySQL唯一索引创建

时间:2026-10-19 07:28     作者:emer     分类: 无


MySQL唯一索引创建

引言

邮箱、手机号、订单号这类业务字段要求不能重复,光靠应用层判断并发下仍可能插入重复值。唯一索引在数据库层直接约束重复,是防脏数据的最后一道保险,同时还能加速等值查询。

建表时定义唯一索引

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    UNIQUE KEY uk_email (email)
);

uk_email是索引名,email列唯一。

已有表追加唯一索引

ALTER TABLE users ADD UNIQUE KEY uk_phone (phone);

数据里已有重复值时会报错1062,需先清理重复再加。

组合唯一索引

多列组合唯一,比如同一商品同一活动只领一次券:

ALTER TABLE coupon ADD UNIQUE KEY uk_user_goods (user_id, goods_id);

允许单列重复,但组合起来不能重复。

插入重复的报错处理

INSERT INTO users(email) VALUES('a@x.com');
-- 再次插入同email触发 1062 Duplicate entry

应用层catch错误码,返回邮箱已注册,而不是让500报错。

插入或更新冲突

INSERT INTO users(email) VALUES('a@x.com')
ON DUPLICATE KEY UPDATE login_time=NOW();

唯一键冲突时转成更新,适合登录时间刷新。

注意事项

总结

唯一索引在建表时用UNIQUE KEY定义,已有表用ALTER TABLE ADD UNIQUE KEY追加,多列组合唯一用组合索引。加之前先清重复,插入冲突用ON DUPLICATE KEY UPDATE转更新,数据库层约束比应用层判断更可靠。

标签: MySQL 唯一索引 数据库优化 unique key 数据约束