截断具有相关外键约束的表

E.R*_*nim 2 sql-server sql-server-2008-r2 truncate

嗨,我试图从我的数据库中截断一些表,但它们与外键约束相关,所以每次我尝试 SQL Server 时都会抛出这样的错误:

无法截断表“Table”,因为它正被 FOREIGN KEY 约束引用

我不想删除表或删除它们。

一位朋友告诉了这个案例的Truncate Cascade,但我没有找到任何相关信息,其他用户也告诉我试试这个;我确实尝试过,但仍然没有截断我的表。

我还阅读了有关外键 DROP 和 RE-CREATE 的 SCRIPT 以与 TRUNCATE 一起使用

脚本应该会影响我的数据库,或者至少我是这么认为的。但是在运行它之后,我无法截断我的表并且它抛出了同样的错误。我正在使用 SQL Server 2008 R2,并使用该版本的 SSMS 运行我的查询。

Sha*_*tor 7

您不能截断具有外键约束的表。我会编写您的 truncate 语句来删除约束,然后截断表,然后重新创建约束。

因为 TRUNCATE TABLE 是一个 DDL 命令,它不能检查表中的记录是否被子表中的记录引用。

这就是 DELETE 有效而 TRUNCATE TABLE 无效的原因:因为数据库能够确保它没有被另一条记录引用。

参考SO用户Michael

SO John Rudy 的另一篇参考文献

根据您对截断级联的引用,有一个基于约束的删除级联或更新。这与截断不同。这是一个包含有关此信息的链接

关于您的链接,它所做的只是运行一个脚本,该脚本创建您可以复制和粘贴的语句,然后在您的数据库上运行。如果您希望它通过截断变得更加自动化;您需要找到一种方法来存储 create 语句,运行 drop 约束语句,截断您的表,然后拉回并运行 create 语句。

如果必须自动化,动态 SQL 可能是您最好的选择。如果是这种情况,我会研究另一种解决方案。也许分区交换或其他什么,但我们需要更多的信息来挖掘自动化最佳实践过程的其他建议。