2008-11-10 30 views
59

以下SQL語句會自動在Table1.Table1Column上創建索引,還是必須顯式創建一個索引?外鍵是否在SQL Server中自動索引?

數據庫引擎是SQL Server上的外鍵2000

 CREATE TABLE [Table1] (
. . . 
      CONSTRAINT [FK_Table1_Table2] FOREIGN KEY 
      (
       [Table1Column] 
      ) REFERENCES [Table2] (
       [Table2ID] 
      ) 

     ) 

回答

59

SQL Server將不會自動創建索引。此外,從MSDN:

一個外鍵約束不必 將只與另一個表中的PRIMARY KEY 約束;它也可以定義爲 以引用另一個表中 中UNIQUE約束的 列。 FOREIGN KEY 約束可以包含空值;但是,如果FOREIGN KEY約束的任何列包含空值 值,則跳過構成FOREIGN KEY 約束的所有值 的驗證。爲了確保 所有合成的FOREIGN KEY約束均已驗證,請在所有參與的 列中指定 NOT NULL。

+0

所有證據似乎指向Table1Column上沒有自動索引。正常創建索引沒有SQL Server抱怨。 – 2008-11-10 21:23:23

+0

引用的文本與問題或索引不會自動創建的內容有什麼關係? – John 2017-07-03 21:38:18

23

當我讀到Mike的問題時,他詢問FK Constraint是否會在FK所在表格(Table1)的FK列上創建一個索引。答案是否定的,一般來說。 (出於約束的目的),不需要這樣做。另一方面,被定義爲約束的「TARGET」的列必須是被引用表中的唯一索引,或者是主鍵或備用鑰匙。 (唯一索引)或創建約束條件將失敗。

(編輯:添加到明確處理下面的評論 - ) 具體來說,當提供一個外鍵約束的數據一致性。索引只會影響FK端的一行或多行的DRI約束的性能。當使用約束時,在插入或更新期間,處理器知道FK值,並且必須檢查PK側參考表中是否存在一行。那裏已經有一個索引。當在PK側刪除一行時,它必須驗證FK側沒有行。在這種情況下,索引可能有一定的幫助。但這不是一個常見的情況。

除此之外,在某些類型的查詢中,查詢處理器需要在使用該外鍵列的連接的多方查找記錄。當該外鍵上存在索引時,加入性能增加。但是,這種情況在連接查詢中使用FK列是特有的,而不是外鍵約束的存在......無論連接的另一端是PK還是其他任意列,都無關緊要。此外,如果您需要過濾或根據FK列對查詢結果進行排序,索引將有所幫助...同樣,這與該列的外鍵約束無關。

4

不,在列上創建外鍵不會自動在該列上創建索引。

無法索引外鍵列將導致每次從引用(父)表中刪除記錄時都會掃描該表。

在該示例性模式:

CREATE TABLE MasterOrder (
    MasterOrderID INT PRIMARY KEY) 

CREATE TABLE OrderDetail(
    OrderDetailID INT, 
    MasterOrderID INT FOREIGN KEY REFERENCES MasterOrder(MasterOrderID) 
) 

的OrderDetail將每一個記錄在MasterOrder表中刪除時間掃描。

因爲索引會影響插入,更新和刪除操作,所以如果父表記錄從不刪除,您可能並不總是希望產生開銷外鍵。