如何在 SQL Server 中禁用 CHECK 约束(T-SQL 示例)
当您尝试将数据输入到具有完全启用的 CHECK 约束的表中时,只有在数据不违反该约束的情况下才会成功。如果尝试输入无效数据,操作将失败并显示错误。
但是,如果您发现自己确实_必须_插入违反约束的数据怎么办?也许约束不再适用,或者您有一个例外,即允许一行绕过约束。无论哪种方式,您都无法输入约束规则之外的任何内容。CHECK
如果您发现自己处于这种情况,您可以随时禁用约束。以下是使用 Transact-SQL 执行此操作的方法。
示例 1 – 禁用检查约束
若要禁用约束,请在语句中使用参数。CHECK``NOCHECK``ALTER TABLE
示例如下:
ALTER TABLE Occupation
NOCHECK CONSTRAINT chkJobTitle;
此代码禁用名为 的约束。chkJobTitle
示例 2 – 查看检查约束
我们可以查询系统视图以验证我们的约束是否已禁用:sys.check_constraints
SELECT name, is_disabled, is_not_trusted, definition FROM sys.check_constraints;
输出:
+-----------------+---------------+------------------+----------------------------------------+
| name | is_disabled | is_not_trusted | definition |
|-----------------+---------------+------------------+----------------------------------------|
| chkPrice | 0 | 0 | ([Price]>(0)) |
| chkValidEndDate | 0 | 0 | ([EndDate]>=[StartDate]) |
| chkTeamSize | 0 | 0 | ([TeamSize]>=(5) AND [TeamSize]<=(20)) |
| chkJobTitle | 1 | 1 | ([JobTitle]<>'Digital Nomad') |
+-----------------+---------------+------------------+----------------------------------------+在本例中,我从当前数据库中选择了所有约束。CHECK
我们可以看到这是唯一被禁用的(因为它的列设置为 )。is_disabled1
您可能会注意到该列也设置为 。这表示系统尚未验证所有行的约束。is_not_trusted1CHECK
换句话说,我们不能再假设约束已经检查了所有数据。禁用约束的事实意味着数据现在无需约束检查即可进入数据库。因此,数据库中可能存在无效数据的可能性。
如果需要重新启用 CHECK 约束,您将有机会恢复约束的信任(通过使用该选项)。这将在启用约束之前检查所有现有行。WITH CHECK
您还可以选择_不_检查现有数据,但只有在极少数情况下才应这样做。
请参阅在 SQL Server 中启用 CHECK 约束时应了解的有关 WITH NOCHECK 的信息,以演示信任如何受到影响,具体取决于重新启用约束的方式。