在SQL Server 2005+(我同時使用)中,是否將UNIQUE
約束添加到列自動創建索引,還是應該仍然CREATE INDEX
?是否使列獨一無二強制創建索引?
4
A
回答
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 CONSTRAINT
和UNIQUE INDEX
:一個命令只是另一個命令的同義詞。
在Oracle
唯一的區別是,UNIQUE INDEX
應該有一個用戶提供的名稱,而一個UNIQUE CONSTRAINT
可以與系統生成的名稱來創建:
ALTER TABLE mytable MODIFY col1 UNIQUE
這將創建稱爲SYS_CXXXXXX
的索引。
相關問題
- 1. Oracle是否自動爲FOREIGN KEY列創建二級索引?
- 2. 是否創建索引事
- 3. 創建二進制索引樹
- 4. pid是否真的獨一無二
- 5. Android Build Model Number是否獨一無二?
- 6. 在臨時表列上創建索引是否唯一?
- 7. 是否可以爲多個列創建一個索引? hiberanate
- 8. 是否創建一個FK自動索引列?
- 9. MySQL是否在創建新索引時使用現有索引?
- 10. 索引創建是否可以使用現有索引?
- 11. 在列上創建唯一約束是否自動創建索引?
- 12. 創建一個jQuery索引來遍歷單獨的列表
- 13. 創建索引列
- 14. 如何使2列獨一無二?
- 15. 如何使多列獨一無二yii2
- 16. 是否可以在Sybase中動態強制索引使用?
- 17. 爲ORDER BY強制索引使用是否更好?
- 18. 使用hashlib.sha256創建唯一的ID;這保證是獨一無二的嗎?
- 19. 無法創建列存儲索引
- 20. 創建一個列的索引Vs的上聚類列創建索引
- 21. 在添加列之前創建索引與添加列之後創建索引 - 是否重要?
- 22. 寫入後優化lucene索引是否是強制性的?
- 23. 是否可以在索引上創建索引?
- 24. 製作索引創建類
- 25. 在每組列上創建索引或爲每列創建單獨的索引,哪個更好?
- 26. ElasticSearch無法創建索引
- 27. 是否用於創建表索引的列隱含地爲UNIQUE?
- 28. 我是否應該通過UNIQUE列創建索引?
- 29. 您是否需要在Hibernate表的@id列上創建索引
- 30. 列忽略創建唯一索引
當您使某一列唯一時,如果該列已被編入索引,Oracle將不會創建唯一索引 - 因爲它可以使用非唯一索引警告唯一約束(儘管通常不建議這樣做)。 – 2009-05-26 02:02:22