如何在 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 |
+--------------------------------+------------------+---------------------+---------------+------------------+