建立外部索引鍵關聯性
適用于:SQL Server 2016 (13.x) 和更新版本
Azure SQL Database
Azure SQL 受控執行個體
本文說明如何使用 SQL Server Management Studio 或 Transact-SQL,在SQL Server中建立外鍵關聯性。 當想要將一個資料表的資料列,與其他資料表的資料列建立相關時,可以建立兩者間的關聯性。
權限
建立具有外部索引鍵的新資料表,需要資料庫中的 CREATE TABLE 權限及建立資料表的結構描述之 ALTER 權限。
在現有資料表中建立外部索引鍵需要此資料表的 ALTER 權限。
限制事項
外部索引鍵條件約束不一定只能連結到另一個資料表中的主索引鍵條件約束。 外部索引鍵也可以定義成參考另一個資料表中 UNIQUE 條件約束的資料行。
在 FOREIGN KEY 條件約束的資料行中輸入 NULL 以外的值時,值必須在參考的資料行中。 否則,系統會傳回外部索引鍵違規錯誤訊息。 若要確定會驗證複合外部索引鍵條件約束的所有值,請對所有參與的資料行指定 NOT NULL。
FOREIGN KEY 條件約束只能參考在相同伺服器之相同資料庫內的資料表。 跨資料庫參考完整性必須利用觸發程序來實作。 如需詳細資訊,請參閱 CREATE TRIGGER。
FOREIGN KEY 條件約束可以參考相同資料表中的另一個資料行,這稱為自我參考。
資料行層級上指定的 FOREIGN KEY 條件約束只能列出一個參考資料行。 這個資料行必須有定義了條件約束的資料行之相同資料類型。
資料表層級上指定的 FOREIGN KEY 條件約束,必須有與條件約束資料行清單中資料行一樣多的參考資料行。 每個參考資料行的資料類型,也必須與資料行清單中的對應資料行相同。
資料庫引擎對資料表可包含該參考其他資料表的 FOREIGN KEY 條件約束數目沒有預先定義的限制。 資料庫引擎也不會限制參考特定資料表之其他資料表所擁有的 FOREIGN KEY 條件約束數目。 不過,FOREIGN KEY 條件約束的實際可用數目,會受到硬體設定及資料庫與應用程式設計的限制。 一個資料表最多可以參考其他 253 個資料表和資料行作為外部索引鍵 (連出參考)。 SQL Server 2016 (13.x) 和更新版本,可參考單一資料表中其他資料表和資料行數目的限制, (傳入參考) 從 253 到 10,000。 (至少需要 130 相容性層級)。此增加具有下列限制:
- DELETE 和 UPDATE DML 作業支援大於 253 的外部索引鍵參考數目。 但是,不支援 MERGE 作業。
- 如果資料表具有參考本身的外部索引鍵,則仍會限制為 253 個外部索引鍵參考。
- 目前,253 個以上的外部索引鍵參考數目不適用於資料行存放區索引、記憶體最佳化資料或 Stretch Database。
暫存資料表不會強制執行 FOREIGN KEY 條件約束。
如果在 CLR 使用者定義的類型資料行上定義外部索引鍵,類型的實作必須支援二進位順序。 如需詳細資訊,請參閱 CLR 使用者定義型別。
只有在所參考的主索引鍵也定義成 varchar(max) 類型時, varchar(max) 類型的資料行才能夠參與外部索引鍵條件約束。
在資料表設計工具建立外部索引鍵關聯性
使用 SQL Server Management Studio
在物件總管中,以滑鼠右鍵按一下關聯性外鍵端的資料表,然後選取 [設計]。
資料表會在資料表設計工具中開啟。
從 [ 資料表設計工具] 功能表中,選取 [ 關聯性]。 (請參閱標頭中的 [資料表設計工具 ] 功能表,或在資料表定義的空白空間中按一下滑鼠右鍵,然後選取 [ 關聯性...]。)
在 [ 外鍵關聯性 ] 對話方塊中,選取 [ 新增]。
關聯性會出現在[選取的關聯性] 清單中,格式為FK_ <tablename> _ < tablename,其中第一個tablename> 是外鍵資料表的名稱,而第二個tablename是主鍵資料表的名稱。 這只是外鍵物件的 (Name) 欄位的預設和一般命名慣例。
在 [選取的關聯性 ] 清單中選取關聯性。
選取右邊方格中的 [資料表和資料行規格 ],然後選取屬性右邊的省略號 (...) 。
在 [資料表和資料行] 對話視窗的 [主索引鍵] 下拉式清單中,選擇將要成為關聯性主索引鍵端的資料表。
在方格的下方,選擇組成資料表主索引鍵的資料行。 在每個資料行右側的鄰近方格資料格,選擇對應到外部索引鍵資料表的外部索引鍵資料行。
[資料表設計工具] 會提供關聯性的建議名稱。 若要變更這個名稱,請編輯 [關聯性名稱] 文字方塊的內容。
選擇 [確定] 建立關聯性。
關閉資料表設計工具視窗,然後 儲存 您的變更,讓外鍵關聯性變更生效。
在新的資料表建立外部索引鍵
使用 Transact-SQL
下列範例會建立資料表,並在參考 SalesReasonID
Sales.SalesReason
資料庫中資料表 AdventureWorks
中資料行的資料行上 TempID
定義外鍵條件約束。 ON DELETE CASCADE 和 ON UPDATE CASCADE 子句用來確定對 Sales.SalesReason
資料表所做的變更會自動傳播至 Sales.TempSalesReason
資料表。
CREATE TABLE Sales.TempSalesReason
(
TempID int NOT NULL, Name nvarchar(50)
, CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID)
, CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE
)
;
在現有的資料表建立外部索引鍵
使用 Transact-SQL
下列範例會在 資料行 TempID
上建立外鍵,並參考資料庫中資料表中的資料 AdventureWorks
行 SalesReasonID
Sales.SalesReason
。
ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE
;