2010-04-20 45 views
9

以下兩條語句有什麼區別?唯一約束和唯一索引之間的區別是什麼

alter table [dbo].[Demo] add constraint [UC_Demo_Code] unique ([Code]) 
go 
create unique nonclustered index [UK_Demo_Code] on [dbo].[Demo] ([NB_Code]) 
go 

約束是否有一個索引來幫助它強制執行唯一性,或者每次插入/更新時都會執行表掃描?

+0

查看http://dba.stackexchange.com/a/55139/6548以獲取詳盡的答案。 – Rory 2016-01-05 21:54:39

回答

9

「邏輯」效應是相同的 - 只有唯一值可以加載到表中。 (值得一提的是,如果該列可以爲空,則只能插入一行NULL)

物理效應是相同的 - 在表上建立唯一索引。它可以是羣集或非羣集。

唯一真正的區別在於元數據中描述數據庫的信息存儲在系統表中。第一種方法是將其內部記錄爲索引,第二種方法將其記錄爲約束 - 即使淨效果相同。這意味着最終唯一的區別就是創建它並在將來改變它的代碼。

(對於SQL 7.0到2005,這是真的,如果他們在2008年改變它,我會感到非常驚訝)。

0

對不起,我的第一個不正確的答案。唯一約束與唯一索引完全相同。在封面下,它確實創建了一個索引。

0

您可以檢查Unique Constraints and Unique Indexes來比較它們之間的差異。

本文的結論是,除了唯一約束也被列爲數據庫中的約束對象這一事實之外,唯一約束與唯一索引之間沒有實際區別。由於無法禁用唯一約束,因此具有約束狀態並不會爲唯一約束提供超出唯一索引的任何其他行爲。但是,有幾個索引創建選項不可用於創建唯一約束的ALTER TABLE命令。