Sql-Server

什麼時候應該使用唯一約束而不是唯一索引?

  • July 20, 2018

當我希望一列具有不同的值時,我可以使用約束

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go

或者我可以使用唯一索引

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);

具有唯一約束的列似乎是唯一索引的良好候選者。

是否有任何已知的理由使用唯一約束而不是使用唯一索引?

在引擎蓋下,唯一約束的實現方式與唯一索引相同 - 需要索引來有效地滿足強制執行約束的要求。即使索引是作為 UNIQUE 約束的結果創建的,如果查詢規劃器認為它是處理給定查詢的最佳方式,它也可以像使用任何其他索引一樣使用它。

因此,對於同時支持這兩種功能的數據庫,選擇使用哪種功能通常歸結為首選樣式和一致性。

如果您打算將索引用作索引(即您的程式碼可能依賴於對該欄位進行快速搜尋/排序/過濾),我將明確使用唯一索引(並註釋源)而不是約束來實現清楚 - 這樣,如果在應用程序的後續版本中更改唯一性要求,您(或其他一些編碼人員)將知道確保將非唯一索引放置在唯一索引的位置(只需刪除唯一約束即可刪除索引完全)。此外,可以在索引提示中命名一個特定的索引(即 WITH(INDEX(ix_index_name)),我認為這不是在幕後創建的用於管理唯一性的索引的情況,因為您不太可能知道它的名稱。

同樣,如果您只需要將唯一性作為業務規則而不是需要搜尋或用於排序的欄位,那麼我將使用約束,再次使預期用途在其他人查看您的表定義時更加明顯。

請注意,如果您在同一欄位上同時使用唯一約束和唯一索引,則數據庫將不夠亮以查看重複項,因此您最終會得到兩個索引,這將消耗額外空間並減慢行插入/更新速度。

引用自:https://dba.stackexchange.com/questions/144