嗨,我正在尝试从我的数据库中截断一些表,但它们与外键约束有关,所以每次我尝试 SQL Server 都会引发如下错误:
无法截断表“表”,因为它被 FOREIGN KEY 约束引用
我不想删除表或删除它们。
一位朋友告诉我这个案例的Truncate Cascade,但我没有找到任何相关信息,其他用户也告诉我试试这个;我确实尝试过,但我的表格仍然没有被截断。
我还阅读了有关外键 DROP 和 RE-CREATE 的 SCRIPT 以与 TRUNCATE 一起使用。
该脚本应该会影响我的数据库,或者至少我是这么认为的。但是在运行它之后,我无法截断我的表并且它抛出了同样的错误。我正在使用 SQL Server 2008 R2,并使用该版本的 SSMS 运行我的查询。
您不能截断具有外键约束的表。我会编写您的 truncate 语句以删除约束,然后截断表,然后重新创建约束。
SO用户迈克尔的参考
SO John Rudy 的另一篇参考资料
根据您对截断级联的引用,有一个基于约束的删除级联或更新。这与截断不同。这是一个链接,其中包含一些相关信息。
关于您的链接,它所做的只是运行一个脚本,该脚本创建您可以复制和粘贴的语句,然后在您的数据库上运行。如果您希望它通过截断变得更加自动化;您需要找到一种方法来存储创建语句,运行删除约束语句,截断您的表,然后拉回并运行创建语句。
如果必须自动化,动态 SQL 可能是您最好的选择。如果是这种情况,我会考虑另一种解决方案。也许是分区交换或其他东西,但我们需要更多信息来挖掘自动化最佳实践过程的其他建议。
您帖子中的两个链接指向生成删除和重新创建所有当前外键所需命令的脚本(我没有测试它们,只是浏览了一下意图)。
但是,在这两种情况下,脚本都将这些命令放在一个变量中,然后打印出来。两个脚本(如图所示)都不会自动执行这些命令。
这对我来说似乎很明智 - 我想查看生成的脚本,尝试理解它们,甚至可能将它们与
CREATE TABLE
SSMS 生成的脚本中的约束进行比较,以确保它们看起来是完整的。第一个链接(指向 DBA.SE 问题)将让您
DELETE
查看表中的行,而不是实际TRUNCATE
的,因此我们将忽略那个。在MSDN 链接中,要实际删除外键,您需要在填充
@strsql
必要的命令以执行删除后执行此命令:如果这是您的实际问题,那么您需要非常小心地在测试数据库上非常彻底地测试这一切,如果需要,您可以轻松恢复。
在删除外键之前,您必须捕获重新创建外键所需的命令。如果您运行了必要的命令来删除外键,然后尝试输入命令以重新创建它们(这是 MSDN 链接中的第二段代码所做的) - 您将一无所获,因为您的外键将已经被丢弃了。
@strsql
确保在删除外键之前捕获重新创建外键所需的命令。此外,请确保将“删除”命令放在与重新创建外键的命令不同的变量中,因为在删除外键之前需要使两组命令都可用。
正确的操作顺序是:
@FK_Create
@FK_Drop
)EXECUTE sp_executesql @FKDrop
TRUNCATE
你的桌子。EXECUTE sp_executesql @FKCreate
这可能有点老了,还要注意这可能会留下孤立的数据,所以只要确保它是你想要做的。