2009-05-25 26 views

回答

8

看到這個MSDN article

數據庫引擎會自動 創建唯一索引來強制UNIQUE 約束的 唯一性要求。

如果你創建一個索引,你會擁有兩個指標,因爲這個例子演示:

create table TestTable (id int) 
alter table TestTable add constraint unique_id unique (id) 
create unique index ix_TestTable_id on TestTable (id) 

select * from sys.indexes where [object_id] = object_id('TestTable') 

這將在TestTable的顯示兩個唯一索引;和代表表格本身的HEAP。

1

當您添加唯一約束創建索引:

Reference - 見第二段。

當一個UNIQUE限制添加到 在 表中現有列或多列,默認情況下,數據庫引擎 檢查該 列中的現有數據,以確保所有值都 獨特。如果將一個唯一約束 添加到重複值爲 的列中,那麼數據庫引擎將返回一個 錯誤並且不會添加約束。

數據庫引擎自動創建一個UNIQUE索引,以強制執行UNIQUE 約束的 唯一性要求。因此,如果嘗試執行 來插入重複行,則 數據庫引擎會返回錯誤 消息,指出違反了UNIQUE 約束條件,並且 不會將該行添加到表中。除非指定 聚簇索引明確指定爲 ,否則默認情況下會創建唯一的非聚簇 索引以強制使用UNIQUE約束 。

2

是的,它的確如此。

事實上,你甚至可以創建一個CLUSTERED UNIQUE CONSTRAINT

ALTER TABLE mytable ADD CONSTRAINT UX_mytable_col1 UNIQUE CLUSTERED (col1) 

,這將使要在col1聚集表。

幾乎所有數據庫都會爲UNIQUE CONSTRAINT創建一個索引,否則很難維護它。

Oracle甚至沒有區分UNIQUE CONSTRAINTUNIQUE INDEX:一個命令只是另一個命令的同義詞。

Oracle唯一的區別是,UNIQUE INDEX應該有一個用戶提供的名稱,而一個UNIQUE CONSTRAINT可以與系統生成的名稱來創建:

ALTER TABLE mytable MODIFY col1 UNIQUE 

這將創建稱爲SYS_CXXXXXX的索引。

+1

當您使某一列唯一時,如果該列已被編入索引,Oracle將不會創建唯一索引 - 因爲它可以使用非唯一索引警告唯一約束(儘管通常不建議這樣做)。 – 2009-05-26 02:02:22

相關問題