如何避免数据库截断中所有表的外键约束?

时间:2010-06-03 11:19:43

标签: sql sql-server

出于设计目的,我需要截断所有具有大量FK的DB。我不能简单地使用DELETE命令,因为有些表设置了TinyInts的Identity并包含大约150个项目。

这是一个查询(截断所选数据库中的所有表格)我正在尝试运行

Declare @t varchar (1024)
Declare tbl_cur cursor for  
select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

OPEN tbl_cur

FETCH NEXT  from tbl_cur INTO @t

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('TRUNCATE TABLE '+ @t)
FETCH NEXT  from tbl_cur INTO @t
END

CLOSE tbl_cur
DEALLOCATE tbl_Cur

使用多个FK实现截断DB的最佳和最简单的方法是什么?

3 个答案:

答案 0 :(得分:4)

如果您避免删除的原因只是为了避免身份列的问题,您可以删除然后使用

DBCC CHECKIDENT('TableName', RESEED, 0)

将它们重置为零。

答案 1 :(得分:2)

如果您尝试删除所有相关表中的所有行,是否可以删除约束,截断表,然后再次创建约束?

或...... this也可能有用。看起来它从依赖树的底部循环直到一切都消失了。

答案 2 :(得分:1)

您可以禁用所有外键,截断表,然后重新启用外键。

禁用:ALTER TABLE table_name NOCHECK CONSTRAINT ALL

启用:ALTER TABLE table_name CHECK CONSTRAINT ALL