2010-02-18 50 views
6

我想記住一些sql語法,並且已經獲得了ALTER TABLE ADD CONSTRAINT語法。我相信我是正確的,當我說當你使用這個語法來添加一個FOREIGN KEY或PRIMARY KEY約束時,那個sql server會自動創建索引來支持約束操作。 (這是真的......還是僅僅在PK上而不是在FK上?)當刪除約束時,支持索引是否也會被刪除?

如果是這樣,當你使用ALTER TABLE DROP CONSTRAINT語法時......是否支持索引自動下降?這些隱式支持索引可以被明確地刪除嗎?如果是的話CONSTRAINT自動刪除?

我只是想知道它是如何工作「下蓋」。谷歌搜索沒有幫助。我想我可以查詢一些sys表來發現真相,但我認爲我會在這裏嘗試。

感謝您的幫助。

賽斯

回答

2

添加主鍵時,實際上添加了唯一索引。是否導致新索引被聚集取決於您是否指定它是非聚簇的。如果在添加主鍵約束時未指定它是聚簇還是非聚簇,那麼如果聚簇約束或索引尚未存在於表上,則它將被聚簇,否則它將爲非聚簇。

當您添加外鍵時,不會自動創建索引。

當您刪除約束時,將刪除作爲約束創建結果而創建的任何索引。但是,如果嘗試刪除唯一或主鍵約束,並且存在引用它的外鍵約束,則會出現錯誤。

作爲約束創建結果創建的索引不能使用DROP INDEX刪除。

2

主鍵約束將添加一個聚集索引表中,如果一個尚不存在,否則唯一的非聚集索引將爲其創建。

刪除主鍵約束還會刪除基礎索引。

外鍵約束不會添加索引。

刪除外鍵約束對索引無效。

外鍵與索引無關。

+0

並非總是如此。如果表上已經有聚簇索引,則PRIMARY KEY約束將由唯一的非聚簇索引強制執行。 – 2010-02-18 20:28:59

+0

在SQL Server 2008中,外鍵與索引有一些共同之處。我無法刪除索引(並且它不是主鍵索引),因爲如果被外鍵引用。 – LukLed 2010-02-18 20:32:40

+1

@LukLed,當你使用FK強制實現一對多的父子關係時,如果你試圖在父對象上刪除唯一性約束,父對象需要是唯一的,它會拋出一個錯誤。 – 2010-02-18 20:34:50

2

FKs不會自動獲得SQL Server中的索引,如果你想要的話你需要添加它!當放棄FK時,您不會刪除索引,您需要自行刪除索引。

2

執行UNIQUE約束的索引將被刪除,支持FK約束的索引不會自動刪除。它也不會自動創建。

相關問題