使用 INSERT 和 UPDATE 陳述式停用外部索引鍵限制

適用於: SQL Server 2016(13.x)及後續版本 Azure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsSQL 資料庫 in Microsoft Fabric

你可以在 SQL Server 中,於 INSERT 和 UPDATE 交易期間,使用 SQL Server Management Studio 或 Transact-SQL 來停用外部索引鍵條件約束。 如果您確知新資料不會違反現有條件約束,或是條件約束只適用於已經在資料庫中的資料,請使用此選項。

限制與約束

停用這些約束後,未來在此資料行上的插入或更新作業將不會根據約束條件進行驗證。

許可

需要資料表的 ALTER 權限。

使用 SQL Server Management Studio

停用 INSERT 和 UPDATE 陳述式的外鍵條件約束

  1. 在 [物件總管]中,展開含有條件約束的資料表,然後展開 [索引鍵] 資料夾。

  2. 以滑鼠右鍵按一下條件約束,然後選取 [修改]。

  3. 在 表格設計器下方的網格中,選擇 強制外鍵限制 ,並從下拉選單中選擇 「否 」。

  4. 選取 關閉。

  5. 若要視需要重新啟用條件約束,請反轉上述步驟。 選擇 強制外鍵限制 ,並從下拉選單中選擇 「是 」。

  6. 若要信任該限制,並檢查外鍵關係中的現有資料,請選擇「 建立時檢查現有資料」或「重新啟用 」,並從下拉選單中選擇 「是 」。 這可確保外部索引鍵條件約束受到信任。

  • 如果 [檢查建立或重新啟用時的現有資料] 設定為 [否],則外部索引鍵在重新啟用時不會檢查現有資料。 因此,查詢最佳化工具無法考慮潛在的效能改善。 建議使用受信任的外來鍵,因為它們可用來在基於外來鍵約束的假設下簡化執行計劃。 若要檢查資料庫中是否信任外部索引鍵,請參閱本文稍後的範例查詢。

使用 Transact-SQL

停用 INSERT 和 UPDATE 陳述式的外鍵條件約束

  1. 在物件總管中連線到資料庫引擎的執行個體。

  2. 在標準列上,選取 [新增查詢]。

  3. 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  4. 若要在需要時重新啟用條件約束,請將下列範例複製並貼到查詢視窗中,然後選取 [執行]。

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  5. 請確認您環境中的限制是受信任且已啟用的。 如果 is_not_trusted = 1,則外部索引鍵不會在重新啟用或重新建立資料時檢查現有的資料。 因此,查詢最佳化工具無法考慮潛在的效能改善。 建議使用受信任的外來鍵,因為它們可用來在基於外來鍵約束的假設下簡化執行計劃。 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。

    SELECT o.name, fk.name, fk.is_not_trusted, fk.is_disabled
    FROM sys.foreign_keys AS fk
    INNER JOIN sys.objects AS o ON fk.parent_object_id = o.object_id
    WHERE fk.name = 'FK_PurchaseOrderHeader_Employee_EmployeeID';
    GO
    

    如果資料表中的現有資料符合外部索引鍵條件約束,您應該將外部索引鍵條件約束設定為受信任。 若要將外部索引鍵設定為受信任,請使用下列指令碼再次信任外部索引鍵條件約束,並記下其他 WITH CHECK 語法。 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。

    ALTER TABLE [Purchasing].[PurchaseOrderHeader] 
    WITH CHECK 
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;
    GO