删除/截断具有外键的表中的记录

时间:2012-02-12 15:30:12

标签: sql-server foreign-key-relationship truncate

这是我的要求,我试图详细说明冒险作品数据库。

我必须删除具有约束和外键关系的Production.Product表的所有记录并填充其他表中的数据(目前我使用此语句来复制表中的数据)

SELECT * INTO Product_temp
FROM [AdventureWorks].[Production].[Product]

所以我必须从Product表中删除所有记录,然后从 product_temp 插入。

我找到了这个答案,但我无法在SQL SERVER 2005中找到此选项

SQL Server 2005 Cascading Delete

2 个答案:

答案 0 :(得分:1)

如果您能够批量替换所有四个表,那么您最快的策略是从所有四个表中删除所有行并重新插入而不是执行“Upsert”(好词@marc_s)。那里有一个建议:我建议使用TRUNCATE清除你的表而不是DELETE。这样做的效果要好得多,因为引擎可以避免将所有这些已删除的记录写入事务日志。显然你需要首先删除你的“边缘”表,那些具有FK到其他表的表。

如果您发现这些表具有循环引用,这使得很难从表中删除行,那么这就是我要做的事情:

  1. 删除表中的所有约束
  2. 截断目标表(由于约束条件消失,序列无关紧要)
  3. 导入数据(如果可以最快加载,请使用bcp!)
  4. 重新应用约束
  5. (可选)更新目标表的统计信息

答案 1 :(得分:1)

您不需要删除外键约束。

  1. 触发删除查询。然后
  2. 2.EXEC sp_MSforeachtable' UPDATE STATISTICS?与FULLSCAN'

    3.Exec sp_MSforeachtable" dbcc dbreindex('?')"