主鍵約束、唯一性約束、唯一性索引的區別
今天我們一起來理一理數據庫中保證數據 唯一性 的三種機制,它們分別是 主鍵約束(Primary Key Constraint)、唯一性約束(Unique Constraint)、唯一性索引(Unique Index)。
一、主鍵約束(Primary Key Constraint)
1、定義:主鍵約束是表中用于 唯一標識每條記錄 的約束,通過一列或多列(復合主鍵)的組合,確保表中不存在兩條完全相同的記錄,且 不允許空值(NULL)。
2、核心特性:
- 唯一性:主鍵列(或列組合)的值必須唯一,不能重復。
- 非空性:主鍵列的值絕對不允許為 NULL(所有列都不能空)。
- 標識性:是表的 "唯一身份證",用于明確區分每條記錄,通常作為其他表的外鍵引用的目標(如訂單表的user_id引用用戶表的主鍵id)。
- 自動關聯索引:數據庫會自動為 - primary key 創建唯一索引(多數數據庫默認是聚集索引,如 SQL Server;Oracle 默認是非聚集索引),以高效維護唯一性。關于 聚集索引與非聚集索引,大家可以看下這篇文章 聚集索引與非聚集索引的區別。
3、示例:
CREATE TABLE user (
id INT PRIMARY KEY, -- 主鍵
name VARCHAR(50)
);
二、唯一性約束(Unique Constraint)
1、定義:唯一性約束是用于保證表中 指定列(或列組合)的值在全表范圍內唯一 的約束,主要用于業務邏輯上的唯一性要求(比如 "身份證號不重復")。
2、核心特性:
- 唯一性:約束列(或列組合)的值必須唯一,不能重復。
- 允許空值:允許列值為 NULL,且 允許多個 NULL(因為 NULL 不等于任何值,包括自身,所以多個 NULL 不違反唯一性)。
- 業務性:不用于標識記錄,僅用于保證業務規則(比如 "一個用戶只能有一個身份證號")。
- 自動關聯索引:數據庫會 自動為 unique constraint 創建唯一索引(默認是非聚集索引),以高效檢查唯一性。
3、示例:
CREATE TABLE user (
id INT PRIMARY KEY, -- 主鍵
id_card VARCHAR(100) UNIQUE -- 唯一約束
);
三、唯一性索引(Unique Index)
1、定義:唯一性索引是一種 物理存儲結構,通過對指定列(或列組合)創建索引,強制該列值唯一,同時 加速基于該列的查詢(如WHERE條件過濾、JOIN關聯)。
2、核心特性:
- 唯一性:索引列(或列組合)的值必須唯一,不能重復。
- 允許空值:同唯一性約束,允許列值為 NULL,且允許多個 NULL。
- 性能導向:核心作用是 優化查詢速度(減少數據掃描范圍),"唯一性" 是附加特性。
- 手動創建:需要顯式通過
CREATE UNIQUE INDEX語句創建,不依賴約束存在。
3、示例:
CREATE UNIQUE INDEX idx_id_card ON user(id_card); -- 唯一索引
對比表格
| 維度 | 主鍵約束(Primary Key) | 唯一性約束(Unique Constraint) | 唯一性索引(Unique Index) |
|---|---|---|---|
| 約束類型 | 邏輯約束(數據完整性規則) | 邏輯約束(數據完整性規則) | 物理結構(索引,優化查詢) |
| 空值允許 | 不允許任何列為 NULL | 允許列值為 NULL(允許多個) | 允許列值為 NULL(允許多個) |
| 數量限制 | 一個表只能有 1 個主鍵(可復合) | 一個表可以有多個唯一性約束 | 一個表可以有多個唯一性索引 |
| 與索引的關系 | 自動創建唯一索引(不可單獨刪除) | 自動創建唯一索引(不可單獨刪除) | 本身就是索引(可單獨創建 / 刪除) |
| 作用核心 | 標識記錄(表的 "身份證") | 保證業務唯一性(如郵箱不重復) | 提升查詢性能(附帶唯一性) |
| 外鍵引用目標 | 可被其他表的外鍵引用 | 通常不被外鍵引用(語義不適合) | 不能被外鍵引用(不是約束) |
| 刪除影響 | 刪除主鍵約束,自動索引會被刪除 | 刪除唯一性約束,自動索引會被刪除 | 刪除索引,不影響約束(若存在) |
總結
- 主鍵約束:唯一標識記錄,非空,表中唯一,是表的 "核心身份標識"。
- 唯一性約束:保證業務字段唯一,允許空,可多個,是 "業務規則的守護者"。
- 唯一性索引:優化查詢速度,附帶唯一性,可多個,是 "性能優化工具"。
世上沒有完美的人,也沒有完美的事。-- 煙沙九洲
?
浙公網安備 33010602011771號