如何在 SQL Server 中禁用外键约束(T-SQL 示例)

发布于

如果您发现自己需要在 SQL Server 中禁用外键约束,下面介绍了如何使用 Transact-SQL 执行此操作。

这将允许您输入数据而不受外键的限制。显然,除非你有很好的理由这样做,否则你不会这样做。外键强制引用完整性,因此禁用它们可能会产生各种问题。

示例 1 – 禁用外键约束

若要禁用外键约束,请在语句中使用参数。NOCHECK``ALTER TABLE

示例如下:

ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;

此代码禁用名为 的外键约束。FK_BandMember_Musician

示例 2 – 查看约束

我们可以查询系统视图以验证我们的约束是否已禁用:sys.foreign_keys

SELECT name AS ‘Constraint’, is_disabled, is_not_trusted FROM sys.foreign_keys;

输出:

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 0             | 0                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+

在本例中,我从当前数据库中选择了所有外键约束。

我们可以看到这是唯一被禁用的(因为它的列设置为 )。is_disabled1

您可能会注意到该列也设置为 。这表示系统尚未验证约束。is_not_trusted1

这是有道理的,因为我们不能再假设约束已经检查了所有数据。禁用约束的事实意味着数据现在无需约束检查即可进入数据库。因此,数据库中可能存在无效数据的可能性。

如果需要重新启用约束,您将有机会还原约束的信任(通过使用选项)。这将在启用约束之前检查所有现有行。WITH CHECK

您还可以选择_不_检查现有数据,但只有在极少数情况下才应这样做。

这里再次使用相同的查询,但有一些额外的列来显示表和引用的表:

SELECT name AS ‘Constraint’, OBJECT_NAME(parent_object_id) AS ‘Table’, OBJECT_NAME(referenced_object_id) AS ‘Referenced Table’, is_disabled, is_not_trusted FROM sys.foreign_keys;

输出:

+--------------------------------+------------------+---------------------+---------------+------------------+
| Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
|--------------------------------+------------------+---------------------+---------------+------------------|
| FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
| FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
| FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
+--------------------------------+------------------+---------------------+---------------+------------------+