我有一个与sql server中的数据有关的问题。在我的数据库中,一些约束没有启用,即它们没有被检查,经过一段时间的努力,我们发现这个问题可以删除父行而不删除子,这是一个问题。我使用查询
启用了数据库中的所有约束ALTER TABLE tbl_name CHECK CONSTRAINT ALL
上面的查询是在该数据库的所有表上执行的,没有任何错误。但我担心的是它是否会起作用,如果它对现有数据起作用,那么父表数据被删除的数据会发生什么。
我想知道是否有任何方法可以验证其父记录在整个数据库中不存在的数据。大约270 constraint
包含FOREIGN KEY AND UNIQUE KEY
。我不想去手动选择。
请帮帮我。
答案 0 :(得分: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)以某种方式为它们重新创建合适的父行。
答案 1 :(得分:0)
您还可以将“ON DELETE CASCADE”代码添加到外键的末尾,以防止孤立的子行持久存在。
这比解决方案更像是一种“更好的实践”,但我相信Damien_The_Unbeliever已回答了你的主要问题。