MySQL中給字段添加唯一約束的方式匯總
一、先明確:為什么必須掌握唯一約束?
- 你是否知道添加唯一約束的多種方式?(創(chuàng)建表時 / 修改表時)
- 能否區(qū)分 “單列唯一約束” 和 “多列唯一約束” 的適用場景?
- 是否了解唯一約束的核心特性?(比如與主鍵的區(qū)別、對 NULL 值的處理)
二、先鋪墊:什么是 MySQL 唯一約束?
唯一約束(UNIQUE Constraint)是 MySQL 中用于限制字段(或多個字段組合)的值不能重復的一種約束,它能保證數(shù)據表中指定字段的唯一性,防止重復數(shù)據插入,從而保障數(shù)據的有效性。比如:用戶表的phone(手機號)字段添加唯一約束后,就無法插入兩個手機號相同的用戶;訂單表的order_no(訂單編號)添加唯一約束后,不會出現(xiàn)重復的訂單編號。
三、核心:添加唯一約束的 3 種方式
-- 基礎表結構(未加唯一約束) CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵(自增) `username` VARCHAR(50) NOT NULL, -- 用戶名 `phone` VARCHAR(11), -- 手機號 `email` VARCHAR(50), -- 郵箱 `dept_id` INT -- 部門ID );
方式 1:創(chuàng)建表時添加唯一約束
在CREATE TABLE語句中,通過UNIQUE關鍵字直接給字段添加唯一約束,支持「單列唯一」和「多列唯一」兩種場景。
1.1 單列唯一約束(單個字段值唯一)
- 語法:在字段定義后直接添加 UNIQUE 關鍵字(或 UNIQUE KEY,兩者等價)。
- SQL 示例 1:創(chuàng)建用戶表時,給username(用戶名)添加唯一約束(保證用戶名不重復)
CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL UNIQUE, -- 單列唯一約束:用戶名唯一 `phone` VARCHAR(11), `email` VARCHAR(50), `dept_id` INT );
- SQL 示例 2:給phone(手機號)添加唯一約束,同時指定約束名稱(便于后續(xù)刪除 / 修改)
CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `phone` VARCHAR(11), `email` VARCHAR(50), `dept_id` INT, -- 單列唯一約束:指定約束名稱(uq_sys_user_phone),更易維護 UNIQUE KEY `uq_sys_user_phone` (`phone`) );
- 適用場景:單個字段需要保證唯一性的場景(如用戶名、手機號、訂單編號)。
1.2 多列唯一約束(聯(lián)合唯一,多個字段組合值唯一)
- 通俗定義:不是單個字段的值唯一,而是多個字段的「組合值」唯一(單個字段值可重復,組合后不可重復)。
- 語法:在表結構末尾通過 UNIQUE KEY 約束名 (字段1, 字段2, ...) 定義。
- SQL 示例:給dept_id(部門 ID)和username(用戶名)添加聯(lián)合唯一約束(同一部門內用戶名不能重復,不同部門可重復)
CREATE TABLE `sys_user` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `phone` VARCHAR(11), `email` VARCHAR(50), `dept_id` INT, -- 多列聯(lián)合唯一約束:同一部門內用戶名唯一 UNIQUE KEY `uq_sys_user_dept_username` (`dept_id`, `username`) );
- 適用場景:需要按 “組合條件” 保證唯一性的場景(如同一部門用戶名唯一、同一商品的規(guī)格組合唯一)。
方式 2:修改表時添加唯一約束(表已存在時使用)
如果表已經創(chuàng)建完成(比如前期設計遺漏了唯一約束),可以通過ALTER TABLE語句添加唯一約束,同樣支持單列和多列場景。
2.1 給單列添加唯一約束
- 語法:ALTER TABLE 表名 ADD UNIQUE KEY [約束名] (字段名);
- SQL 示例:給已存在的sys_user表的email字段添加唯一約束
-- 方式1:不指定約束名(MySQL會自動生成默認約束名,不推薦) ALTER TABLE `sys_user` ADD UNIQUE KEY (`email`); -- 方式2:指定約束名(推薦,便于后續(xù)維護) ALTER TABLE `sys_user` ADD UNIQUE KEY `uq_sys_user_email` (`email`);
2.2 給多列添加聯(lián)合唯一約束
- 語法:ALTER TABLE 表名 ADD UNIQUE KEY 約束名 (字段1, 字段2, ...);
- SQL 示例:給已存在的sys_user表添加dept_id和username的聯(lián)合唯一約束
ALTER TABLE `sys_user` ADD UNIQUE KEY `uq_sys_user_dept_username` (`dept_id`, `username`);
- 適用場景:表已創(chuàng)建完成,需要補充唯一約束的場景(如需求迭代后新增唯一性要求)。
方式 3:創(chuàng)建唯一索引(功能等價于唯一約束)
MySQL 中,唯一約束的本質是通過唯一索引實現(xiàn)的,創(chuàng)建唯一索引(CREATE UNIQUE INDEX)和添加唯一約束在功能上完全一致,都能保證字段值的唯一性。
- 語法:CREATE UNIQUE INDEX 索引名 ON 表名 (字段1, 字段2, ...);
- SQL 示例 1:給sys_user表的phone字段創(chuàng)建唯一索引
CREATE UNIQUE INDEX `idx_sys_user_phone_unique` ON `sys_user` (`phone`);
- SQL 示例 2:給sys_user表的dept_id和username創(chuàng)建聯(lián)合唯一索引
CREATE UNIQUE INDEX `idx_sys_user_dept_username_unique` ON `sys_user` (`dept_id`, `username`);
- 適用場景:更偏向 “索引優(yōu)化” 場景(比如需要通過唯一索引提升查詢效率,同時保證數(shù)據唯一性),實習生了解即可,優(yōu)先掌握前兩種方式。
四、唯一約束的核心特性
- 對 NULL 值的處理:唯一約束允許字段存儲多個
NULL值(因為 MySQL 中NULL不等于任何值,包括它自身)。 - 與主鍵(PRIMARY KEY)的區(qū)別:
| 特性 | 唯一約束(UNIQUE) | 主鍵(PRIMARY KEY) |
|---|---|---|
| 唯一性 | 保證字段值唯一 | 保證字段值唯一 |
| 非空性 | 允許 NULL 值(單列) | 不允許 NULL 值 |
| 一個表數(shù)量 | 可以有多個唯一約束(單列 / 多列) | 一個表只能有一個主鍵(可聯(lián)合主鍵) |
| 索引類型 | 唯一索引 | 聚簇索引 |
約束的刪除:如果需要刪除唯一約束,可通過約束名 / 索引名刪除:
-- 語法:ALTER TABLE 表名 DROP INDEX 約束名/索引名; ALTER TABLE `sys_user` DROP INDEX `uq_sys_user_phone`;
加分項
- 結合項目舉例:“我在實訓項目的用戶注冊模塊中,給手機號phone字段添加了唯一約束,避免同一手機號重復注冊;同時給部門 IDdept_id和用戶名username添加了聯(lián)合唯一約束,保證同一部門內用戶名不重復”;
- 區(qū)分場景選擇方式:“創(chuàng)建表時我會直接添加唯一約束,表已存在時用ALTER TABLE補充,需要提升查詢效率時會創(chuàng)建唯一索引”;
- 注意 NULL 值特性:“我知道唯一約束允許多個 NULL 值,所以如果手機號是必填項,我會同時給phone字段加NOT NULL和唯一約束,避免出現(xiàn)空值重復問題”。
踩坑點
- 混淆唯一約束和主鍵:比如認為 “一個表只能有一個唯一約束”,或給需要非空的字段只加唯一約束不加NOT NULL;
- 忽略多列聯(lián)合唯一的邏輯:比如誤以為多列聯(lián)合唯一是 “每個字段都唯一”,而不是 “組合值唯一”;
- 不指定約束 / 索引名:創(chuàng)建唯一約束時不指定名稱,后續(xù)需要刪除 / 修改時無法快速定位(依賴 MySQL 默認生成的復雜名稱)。
舉一反三
1、“唯一約束和主鍵有什么區(qū)別?如果我想讓手機號既非空又唯一,該怎么設置?”(答案:給phone字段同時添加NOT NULL和UNIQUE約束);
2、“我 插入一條username為‘zhangsan’、dept_id為 1 的記錄后,還能插入username為‘zhangsan’、dept_id為 2 的記錄嗎?為什么?”(答案:可以,因為是聯(lián)合唯一約束,組合值不同即可);
3、“如何刪除sys_user表中uq_sys_user_phone這個唯一約束?”(答案:ALTER TABLE sys_user DROP INDEX uq_sys_user_phone;)。
以上就是MySQL中給字段添加唯一約束的方式匯總的詳細內容,更多關于MySQL字段添加唯一約束的資料請關注腳本之家其它相關文章!
相關文章
MySQL數(shù)據庫中的DDL庫操作方法詳解(Linux版)
DDL語句主要用于定義和管理數(shù)據庫中的各種對象,如表、索引、視圖和存儲過程等,常見的DDL語句包括CREATE、ALTER和DROP等,這篇文章主要介紹了MySQL數(shù)據庫中DDL庫操作方法的相關資料,需要的朋友可以參考下2026-04-04
MySQL數(shù)據庫中的UPDATE(更新數(shù)據)詳解
這篇文章主要詳細介紹了MySQL的UPDATE語句,包括其基本語法、高級用法、性能優(yōu)化策略以及注意事項,通過示例和實戰(zhàn),幫助讀者更好地理解和應用這一重要的SQL命令,需要的朋友可以參考下2024-12-12

