FOREIGN KEY 條件約束

外部索引鍵 (FK) 是可用來建立與強制兩資料表的資料之間連結的一個資料行或資料行組合。您可在建立或修改資料表時定義 FOREIGN KEY 條件約束,以建立外部索引鍵。

在外部索引鍵參考中,當存放一個資料表的主索引鍵值的資料行被另一個資料表的資料行參考時,兩資料表之間會建立連結。此資料行會成為第二個資料表的外部索引鍵。

例如,AdventureWorks2008R2 資料庫中的 Sales.SalesOrderHeader 資料表與 Sales.SalesPerson 資料表之間有連結,因為銷售訂單和銷售人員之間有邏輯關聯性。SalesOrderHeader 資料表中的 SalesPersonID 資料行符合 SalesPerson 資料表的主索引鍵資料行。SalesOrderHeader 資料表中的 SalesPersonID 資料行是 SalesPerson 資料表的外部索引鍵。

SalesOrderHeader.SalesPersonID 為外部索引鍵。

FOREIGN KEY 條件約束不一定只能連結到另一個資料表的 PRIMARY KEY 條件約束;它也可以定義成參考其他資料表中 UNIQUE 條件約束的資料行。FOREIGN KEY 條件約束可包含 Null 值;不過,若複合 FOREIGN KEY 條件約束的任何資料行包含了 Null 值,將會略過構成 FOREIGN KEY 條件約束的所有值之驗證工作。若要確定會驗證複合 FOREIGN KEY 條件約束的所有值,請對所有參與的資料行指定 NOT NULL。

[!附註]

FOREIGN KEY 條件約束可參考相同資料庫中資料表的資料行或是參考相同資料表中的資料行。這些稱為「自我參考」資料表。例如,有一個包含三個資料行的員工資料表:employee_numberemployee_namemanager_employee_number。因為經理也是一位員工,所以從 manager_employee_number 資料行到 employee_number 資料行有一個外部索引鍵的關聯性。

參考完整性

雖然 FOREIGN KEY 條件約束的主要目的是控制可儲存於外部索引鍵資料表中的資料,它也可控制主索引鍵資料表中的資料變更。例如,將銷售員的資料列從 Sales.SalesPerson 資料表中刪除,而該銷售員的識別碼是使用於 Sales.SalesOrderHeader 資料表的銷售訂單中,這樣就會破壞這兩個資料表之間的關聯完整性;所刪除之銷售員的銷售訂單在 SalesOrderHeader 資料表中會被遺棄,因為無法連結到 SalesPerson 資料表內的資料。

FOREIGN KEY 條件約束就可避免此情況。若針對主索引鍵資料表的資料所做的變更,會讓指到外部索引鍵資料表內資料的連結無效,則此條件約束將會禁止執行此變更,以強制參考完整性。若您想刪除主索引鍵資料表內的資料列,或變更主索引鍵的數值,但是被刪除或變更的主索引鍵對應到另一個資料表的 FOREIGN KEY 條件約束的數值,此動作將會失敗。若要成功地變更或刪除 FOREIGN KEY 條件約束中的資料列,您必須先刪除外部索引鍵資料表中的外部索引鍵資料,或變更外部索引鍵資料表內的外部索引鍵資料,藉此將外部索引鍵連結至不同的主索引鍵資料。

檢索 FOREIGN KEY 條件約束

基於下列原因,在外部索引鍵上建立索引通常很有幫助:

  • 變更 PRIMARY KEY 條件約束將根據關聯資料表內的 FOREIGN KEY 條件約束來做檢查。

  • 當關聯資料表的資料藉著將資料表的 FOREIGN KEY 條件約束和另一個資料表的主要或唯一索引鍵資料行進行比對,而合併於查詢中時,通常會使用外部索引鍵資料行來聯結準則。索引可讓 Database Engine 在外部索引鍵資料表中快速尋找相關資料。不過,建立此索引並非必要。即使於資料表之間沒有定義 PRIMARY KEY 或 FOREIGN KEY 條件約束,仍可合併兩個關聯資料表的資料,不過兩個資料表之間的外部索引鍵關聯性代表這兩個資料表已經過最佳化,可合併於使用該索引鍵作為準則的查詢之中。如需將 FOREIGN KEY 條件約束用於聯結的詳細資訊,請參閱<聯結基礎觀念>和<查詢類型和索引>。

資料表中的 FOREIGN KEY 條件約束數目

對於資料表可包含的 FOREIGN KEY 條件約束數目 (它們參考其他資料表),或參考特定資料表的其他資料表擁有的 FOREIGN KEY 條件約束數目,SQL Server 沒有預先定義的限制。不過,FOREIGN KEY 條件約束的實際數目卻受到硬體組態和資料庫與應用程式設計的限制。我們建議資料表不要包含超過 253 個 FOREIGN KEY 條件約束,而且參考它的 FOREIGN KEY 條件約束也不要超過 253 個。當您設計資料庫和應用程式時,請考慮到強制 FOREIGN KEY 條件約束的成本。