共用方式為


建立外鍵關聯

本主題描述如何使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 2014 中建立外鍵關聯性。 當想要將一個資料表的資料列,與其他資料表的資料列建立相關時,可以建立兩者間的關聯性。

本主題內容

開始之前

限制與制約

  • 外鍵條件約束不一定只能連結到另一個數據表中的主鍵條件約束;它也可以用來參考另一個數據表中 UNIQUE 條件約束的數據行。

  • 在 FOREIGN KEY 條件約束的資料行中輸入 NULL 以外的值時,值必須在參考的資料行中;否則,系統會傳回外部索引鍵違規錯誤訊息。 若要確保複合外鍵約束中的所有值都已被驗證,請在所有相關的資料行上指定 NOT NULL。

  • FOREIGN KEY 條件約束只能參考在相同伺服器之相同資料庫內的資料表。 跨資料庫參考完整性必須利用觸發程序來實作。 如需詳細資訊,請參閱 CREATE TRIGGER (TRANSACT-SQL)

  • FOREIGN KEY 條件約束可以參考相同資料表中的另一個資料行。 這稱為自我參考。

  • 在數據行層級指定的FOREIGNKEY條件約束只能列出一個參考數據行。 這個資料行必須有定義了條件約束的資料行之相同資料類型。

  • 在數據表層級指定的FOREIGN KEY條件約束必須具有與條件約束數據行清單中資料行數目相同的參考資料行數目。 每個參考資料行的資料類型,也必須與資料行清單中的對應資料行相同。

  • Database Engine 對數據表可以包含該參考其他數據表的 FOREIGN KEY 條件約束數目,或是參考特定數據表之其他數據表所擁有的 FOREIGN KEY 條件約束數目沒有預先定義的限制。 不過,FOREIGN KEY 條件約束的實際可用數目,會受到硬體組態及資料庫和應用程式設計的限制。 建議資料表所包含的 FOREIGN KEY 條件約束數目不要超出 253 個,參考資料表的 FOREIGN KEY 條件約束數目也不要超出 253 個。

  • 臨時表上不會強制執行 FOREIGN KEY 限制。

  • 如果在 CLR 使用者定義的類型資料行上定義外部索引鍵,類型的實作必須支援二進位順序。 如需詳細資訊,請參閱 CLR 使用者定義型別

  • 型別為 varchar(max) 的欄位只有在其參照的主鍵也定義為型別 varchar(max) 時,才能參與 FOREIGN KEY 條件約束。

安全

權限

建立具有外鍵的新數據表需要資料庫中的 CREATE TABLE 許可權,以及建立數據表之架構的 ALTER 許可權。

在現有的數據表中建立外鍵需要數據表的 ALTER 許可權。

使用 SQL Server Management Studio

在表設計器中建立外鍵關係

  1. 在 [物件總管] 中,以滑鼠右鍵單擊將作為關聯性外鍵的資料表,然後按 [設計]。

    數據表會在 數據表設計工具中開啟。

  2. 從 [ 數據表設計工具] 功能表單中,單擊 [ 關聯性]。

  3. 在 [ 外鍵關聯性] 對話框中,按兩下 [ 新增]。

    關聯性會出現在 [選取的關聯性] 清單中,其格式為系統提供的名稱,格式為 FK_<tablename>_<tablename,其中 tablename> 是外鍵數據表的名稱。

  4. 按一下 選取的關聯 清單中的關聯。

  5. 按下右側方格中的 [數據表和數據行規格 ],然後按下屬性右邊的省略號 (...)。

  6. 資料表和欄 對話方塊中的 主鍵 下拉式清單中,選擇將位於關聯性主鍵端的資料表。

  7. 在下方的網格中,選擇作為資料表主鍵的資料列。 在每個欄左邊的相鄰格子中,選擇外鍵表的對應外鍵欄。

    [資料表設計工具] 會提供關聯性的建議名稱。 若要變更這個名稱,請編輯 [關聯性名稱] 文字方塊的內容。

  8. 選擇 確定 來建立關係。

使用 Transact-SQL

在新數據表中建立外鍵

  1. 物件總管中,連線到資料庫引擎實例。

  2. 在標準列上,按一下 [新增查詢]

  3. 複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。 此範例會建立表格,並在TempID欄位上定義一個外鍵約束,該外鍵參考Sales.SalesReason表格中的SalesReasonID欄位。 ON DELETE CASCADE 和 ON UPDATE CASCADE 子句是用來確保對數據表所做的 Sales.SalesReason 變更會自動傳播至 Sales.TempSalesReason 數據表。

    USE AdventureWorks2012;  
    GO  
    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  
    );GO  
    
    

在現有的數據表中建立外鍵

  1. 物件總管中,連線到資料庫引擎實例。

  2. 在標準列上,按一下 [新增查詢]

  3. 複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。 此範例會在欄位TempID上建立外鍵,並在Sales.SalesReason數據表中參考欄位SalesReasonID

    USE AdventureWorks2012;  
    GO  
    ALTER TABLE Sales.TempSalesReason   
    ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)   
        REFERENCES Sales.SalesReason (SalesReasonID)   
        ON DELETE CASCADE  
        ON UPDATE CASCADE  
    ;  
    GO  
    
    

    如需詳細資訊,請參閱 ALTER TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)table_constraint (Transact-SQL)