0

我有一个与 sql server 中的数据相关的问题。在我的数据库中,一些约束没有启用,即它们没有被检查,经过一段时间的处理,我们发现这个问题可以在不删除子行的情况下删除父行,这是一个问题。我使用查询启用了数据库中的所有约束

ALTER TABLE tbl_name CHECK CONSTRAINT ALL 

上面的查询在该数据库的所有表上执行,没有任何错误。但我担心的是它是否会起作用,如果它适用于现有数据,那么那些父表数据已被删除的数据会发生什么。

我想知道是否有任何方法可以验证整个数据库中不存在父记录的此类数据数据。有关于270 constraint包含FOREIGN KEY AND UNIQUE KEY. 我不想选择手动选项。

请帮帮我。

4

2 回答 2

1
ALTER TABLE tbl_name CHECK CONSTRAINT ALL

仅重新启用约束。重要的是,约束不会针对数据库中的现有数据进行检查(优化器也不信任它们)。如果您希望发生这种情况,您还需要指定WITH CHECK

ALTER TABLE tbl_name WITH CHECK CHECK CONSTRAINT ALL

(是的,这个词CHECK出现了两次)

如果执行此操作,并且存在孤立的子行(或其他无效约束),ALTER TABLE则将失败并显示错误消息。SQL Server 无法解决此问题 - 由您决定是 a) 删除孤立的行,还是 b) 以某种方式为它们重新创建合适的父行。

于 2012-09-18T06:13:45.057 回答
0

您还可以将“ON DELETE CASCADE”代码添加到外键的末尾,以防止孤立的子行持续存在。

这更像是一种“更好的实践”,而不是一个解决方案,但我相信 Damien_The_Unbeliever 已经回答了你的主要问题。

于 2012-11-27T19:45:59.013 回答