sql-server - 通过检查现有数据启用外键

标签 sql-server tsql sql-server-2008

我喜欢外键,但我遇到了一个问题。我有一个转换程序,我在其中禁用表的外键。我这样做的原因是,我可以重新转换主表中的所有记录,但让依赖于该记录的其他表保持不变,而不必每次都重新转换它们,因为它们很大。

我使用这些命令来禁用和重新启用外键:

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

ALTER TABLE MyTable CHECK CONSTRAINT MyConstraint

但是,在我重新启用约束“检查创建或重新启用时的现有数据”后,该约束仍设置为“否”。我知道它设置为“否”是因为我禁用了该约束,但通过这样做,它改变了我的数据库模式,我不喜欢。我认为这将被考虑重新启用约束并检查现有数据,但显然不是。

是否无法使用 ALTER TABLE 命令更改此设置?我知道如果我删除约束并重新创建它就可以,但我不打算编写脚本来重新创建我拥有的每个外键并维护它。

我使用的是 SQL Server 2008 R2。

最佳答案

要重新启用约束:

 -- Enable the constraint
 ALTER TABLE MyTable 
 WITH CHECK CHECK CONSTRAINT MyConstraint
 GO

注意:您必须指定CHECK两次才能强制检查所有外键值是否有效。

FOREIGN KEY and CHECK constraints that are disabled are marked is_not_trusted.These are viewable in the sys.check_constraints and sys.foreign_keys catalog views. This means that the constraint is no longer being verified by the system for all rows of the table. Even when you re-enable the constraint, it will not reverify the existing rows against the table unless you specify the WITH CHECK option of ALTER TABLE. Specifying WITH CHECK marks the constraint as trusted again.

引用:Guidelines for Disabling Indexes and Constraints

正如评论中所述(对于搜索引擎),这对应于

sys.foreign_keys.is_not_trusted

在目录 View 中

关于sql-server - 通过检查现有数据启用外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7163009/

相关文章:

sql - 如何将单行与sql中列中的数字相乘

java - 为什么我没有连接? Java..SQL Server Express 版(服务器)

sql-server - TVP 不符合表类型

SQL Server 查询排名 (RowNumber) 和分组

sql-server - 如何加快 SQL Server 中的 select 语句速度

c# - 在 SQL Server 中最后更新记录时保存

c# - SQL 查询后重定向页面

sql-server - 如何通过累积连接获取 SQL 中字符串值的分组

sql - 使用 SQL 求协方差

sql-server - 错误处理的基本原理?