最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中給字段添加唯一約束的方式匯總

 更新時間:2025年12月21日 14:40:46   作者:程序員阿鵬  
唯一約束是 MySQL 中用于限制字段的值不能重復的一種約束,它能保證數(shù)據表中指定字段的唯一性,防止重復數(shù)據插入,從而保障數(shù)據的有效性,本文給大家介紹了MySQL中給字段添加唯一約束的方式,需要的朋友可以參考下

一、先明確:為什么必須掌握唯一約束?

  1. 你是否知道添加唯一約束的多種方式?(創(chuàng)建表時 / 修改表時)
  2. 能否區(qū)分 “單列唯一約束” 和 “多列唯一約束” 的適用場景?
  3. 是否了解唯一約束的核心特性?(比如與主鍵的區(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)先掌握前兩種方式。

四、唯一約束的核心特性

  1. 對 NULL 值的處理:唯一約束允許字段存儲多個NULL值(因為 MySQL 中NULL不等于任何值,包括它自身)。
  2. 與主鍵(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`;

加分項

  1. 結合項目舉例:“我在實訓項目的用戶注冊模塊中,給手機號phone字段添加了唯一約束,避免同一手機號重復注冊;同時給部門 IDdept_id和用戶名username添加了聯(lián)合唯一約束,保證同一部門內用戶名不重復”;
  2. 區(qū)分場景選擇方式:“創(chuàng)建表時我會直接添加唯一約束,表已存在時用ALTER TABLE補充,需要提升查詢效率時會創(chuàng)建唯一索引”;
  3. 注意 NULL 值特性:“我知道唯一約束允許多個 NULL 值,所以如果手機號是必填項,我會同時給phone字段加NOT NULL和唯一約束,避免出現(xiàn)空值重復問題”。

踩坑點

  1. 混淆唯一約束和主鍵:比如認為 “一個表只能有一個唯一約束”,或給需要非空的字段只加唯一約束不加NOT NULL;
  2. 忽略多列聯(lián)合唯一的邏輯:比如誤以為多列聯(lián)合唯一是 “每個字段都唯一”,而不是 “組合值唯一”;
  3. 不指定約束 / 索引名:創(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將表名稱修改成大寫的存儲過程

    MYSQL將表名稱修改成大寫的存儲過程

    這篇文章主要為大家詳細介紹了MYSQL將表名稱修改成大寫的存儲過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • MySQL 8.0數(shù)據字典的初始化與啟動流程

    MySQL 8.0數(shù)據字典的初始化與啟動流程

    數(shù)據字典(Data Dictionary, DD)用來存儲數(shù)據庫內部對象的信息,這些信息也被稱為元數(shù)據(Metadata),包括schema名稱、表結構、存儲過程的定義等,本文主要介紹MySQL 8.0數(shù)據字典的基本概念和數(shù)據字典的初始化與啟動加載的主要流程,需要的朋友可以參考下
    2024-06-06
  • MySQL對前N條數(shù)據求和的幾種方案

    MySQL對前N條數(shù)據求和的幾種方案

    本文詳細介紹了在MySQL中計算分組數(shù)據中排名前N的記錄的合計值的幾種方法,通過對比不同的解決方案,推薦使用窗口函數(shù)和臨時表的結合方案,以提高查詢性能,需要的朋友可以參考下
    2026-01-01
  • 如何優(yōu)雅安全的備份MySQL數(shù)據

    如何優(yōu)雅安全的備份MySQL數(shù)據

    這篇文章主要介紹了如何優(yōu)雅安全的備份MySQL數(shù)據的相關資料,需要的朋友可以參考下
    2022-10-10
  • MySQL數(shù)據備份之mysqldump的使用方法

    MySQL數(shù)據備份之mysqldump的使用方法

    mysqldump常用于MySQL數(shù)據庫邏輯備份,這篇文章主要給大家介紹了關于MySQL數(shù)據備份之mysqldump使用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • MySQL數(shù)據庫中的DDL庫操作方法詳解(Linux版)

    MySQL數(shù)據庫中的DDL庫操作方法詳解(Linux版)

    DDL語句主要用于定義和管理數(shù)據庫中的各種對象,如表、索引、視圖和存儲過程等,常見的DDL語句包括CREATE、ALTER和DROP等,這篇文章主要介紹了MySQL數(shù)據庫中DDL庫操作方法的相關資料,需要的朋友可以參考下
    2026-04-04
  • mysql存儲emoji表情步驟詳解

    mysql存儲emoji表情步驟詳解

    在本篇內容中小編給大家整理了關于mysql存儲emoji表情的詳細步驟以及知識點,需要的朋友們學習下。
    2019-03-03
  • mysql部分替換sql語句分享

    mysql部分替換sql語句分享

    有時候需要對mysql中的內容進行部分替換,那么可以參考下面的文章。
    2011-11-11
  • MySQL數(shù)據庫中的UPDATE(更新數(shù)據)詳解

    MySQL數(shù)據庫中的UPDATE(更新數(shù)據)詳解

    這篇文章主要詳細介紹了MySQL的UPDATE語句,包括其基本語法、高級用法、性能優(yōu)化策略以及注意事項,通過示例和實戰(zhàn),幫助讀者更好地理解和應用這一重要的SQL命令,需要的朋友可以參考下
    2024-12-12
  • mysql 5.7.25 壓縮版安裝配置方法圖文教程

    mysql 5.7.25 壓縮版安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.25 壓縮版安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論

庐江县| 右玉县| 佛教| 漳平市| 北流市| 遂溪县| 利川市| 女性| 河北区| 乐东| 楚雄市| 怀集县| 浦城县| 互助| 凤冈县| 天门市| 金山区| 陇西县| 龙岩市| 长武县| 嘉善县| 大方县| 吴江市| 马山县| 香港 | 贵港市| 普陀区| 吉隆县| 丹江口市| 达拉特旗| 确山县| 昭通市| 昌图县| 林州市| 阿克苏市| 洛阳市| 易门县| 台北县| 赤峰市| 黄山市| 嘉禾县|