使用 INSERT 和 UPDATE 语句禁用外键约束

适用于: SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

在 SQL Server 中,可以通过使用 SQL Server Management Studio 或 Transact-SQL,在 INSERT 和 UPDATE 事务期间禁用外键约束。 如果知道新数据不会与现有约束冲突或者如果约束仅适用于数据库中已有的数据,则可选择此选项。

限制和局限

在禁用这些约束后,在将来插入或更新列时,将不会根据约束条件进行验证。

权限

需要对表的 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
    

后续步骤