筆記目錄

Skip to content

Unique Constraint VS Unique Index

TLDR

  • Unique Constraint 與 Unique Index 在資料唯一性驗證與查詢效能上並無實質差異。
  • 建立 Unique Constraint 時,SQL Server 會自動建立一個對應的 Unique Index。
  • 使用 Unique Constraint 的主要目的是為了語意明確,表達該欄位具有業務邏輯上的唯一性約束。
  • Foreign Key 可以參照 Unique Constraint,也可以參照 Unique Index。
  • 在 SSMS 中,Unique Constraint 會顯示於「索引鍵」資料夾,而獨立建立的 Unique Index 則顯示於「索引」資料夾。

核心差異分析

在 SQL Server 中,Unique Constraint(唯一約束)與 Unique Index(唯一索引)雖然都能確保資料的唯一性,但兩者的設計初衷與呈現方式有所不同。

什麼情況下會遇到這個問題:當開發者在設計資料庫架構,需要決定該使用 Constraint 還是 Index 來限制欄位值不重複時。

根據 Microsoft 官方文件,兩者在資料驗證方式與查詢最佳化工具的處理上並無明顯差異。主要的區別在於:

  • 語意層面:Unique Constraint 明確定義了資料表層級的業務規則,強調「唯一性」是資料完整性的一部分。
  • 管理層面:建立 Unique Constraint 時,系統會自動產生一個關聯的 Unique Index。
  • 關聯性:雖然 Foreign Key 參照時通常指向 Primary Key 或 Unique Constraint,但在 SQL Server 中,參照至 Unique Index 也是可行的。

實作與驗證

建立方式

若要透過 SQL 語法建立,可參考以下範例:

sql
-- 建立 Unique Constraint
ALTER TABLE {TableName} ADD CONSTRAINT {IndexName} UNIQUE ({ColumnName});

-- 建立 Unique Index
CREATE UNIQUE INDEX {IndexName} ON {TableName} ({ColumnName});

SSMS 中的識別方式

什麼情況下會遇到這個問題:當需要從 SQL Server Management Studio (SSMS) 的物件總管中區分兩者時。

  • Unique Constraint:會顯示在資料表的「索引鍵 (Keys)」資料夾中。
  • Unique Index:會顯示在資料表的「索引 (Indexes)」資料夾中。

TIP

若在資料表設計介面中,將「型別」設定為「唯一索引鍵」並將「是唯一」設為「是」,系統會自動建立 Unique Constraint。若僅是單純建立索引,則應選擇「索引」型別。

建議做法

  • 若該欄位的唯一性屬於業務邏輯的一部分(例如:員工編號、Email),建議使用 Unique Constraint,這能讓資料庫結構的意圖更清晰。
  • 若僅是為了提升特定查詢的效能,且該欄位允許 Null 值或不具備強業務約束意義,則使用 Unique Index 即可。

異動歷程

  • 2024-07-25 初版文件建立。