带有约束的TRUNCATE TABLES

时间:2010-01-26 18:19:48

标签: sql sql-server sql-server-2005 tsql

有没有办法截断带约束的表?

我试图解决这个问题:

DECLARE @SQLtxt varchar(max)
SET @SQLtxt = '-- DESACTIVER LES CONTRAINTES' + CHAR(10)
SELECT @SQLtxt = @SQLtxt + 'ALTER TABLE [' + name + '] NOCHECK CONSTRAINT ALL;' FROM sys.tables
PRINT @SQLtxt

当然,它没有奏效。我必须删除约束然后重新创建它们!我能使其工作的唯一方法是提取脚本以删除并重新创建约束。

还有其他方法吗?顺便说一下,我不想删除,因为它会使用事务日志。

4 个答案:

答案 0 :(得分:1)

TRUNCATE命令不适用于具有FK引用的表。直接从documentation

  

您不能在a上使用TRUNCATE TABLE   由FOREIGN KEY引用的表   约束;相反,使用DELETE   没有WHERE子句的语句。   因为未记录TRUNCATE TABLE,   它无法激活触发器。

答案 1 :(得分:1)

这是一个可以帮助您编写FK脚本的脚本。 Script out your foreign keys

我使用修改后的版本将约束定义转储到临时表中,然后执行TRUNCATE魔术,然后从临时表中重新创建约束。但是,这只是为了方便我将生产数据库恢复到非生产环境以摆脱大部分数据。不确定,我会在生产场景中使用它。我宁愿小批量删除,知道一切都已完全记录。

顺便说一下,womb对SQL Server 2000联机丛书的引用有点误导。 TRUNCATE TABLE一直是最低限度记录的操作。

  

TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并且只有页面解除分配记录在事务日志中。

在以后版本的联机丛书中更准确地指出了这一点。

答案 2 :(得分:0)

你自己回答了这个问题 - 如果有一个外键引用你的表,SQL Server需要在事务日志中提供这些信息。由于TRUNCATE TABLE有效地绕过了日志,因此外键引用的表不允许这样做。

您要么必须DROP外键约束,要么使用DELETE语句。

答案 3 :(得分:0)

它只是引用(例如REFERENCES位)您需要删除的外键。

这应该会更容易......