2010-02-05 38 views
0

引用直出MSDN docs for Sql Server 2005的:什么效果相当于截断表,当表是由外键

  • 被引用:

    你不能对表使用TRUNCATE TABLE一个FOREIGN KEY约束。

  • 参与索引视图。
  • 通过使用事务复制或合并复制发布。

我想要的TRUNCATE(它重置IDENTITY类型列具体的事实)的影响,但我不能用一个外键在其他地方使用一个在我的情况,因为我的表中被引用数据库。

更新:这是一个测试配置中我清理掉引用表一样,所以外键的完整性是一个不是问题的问题。

还有什么其他方法可以解决这个问题?

回答

1

可以删除所有的行,然后执行DBCC CHECKIDENT(表名,RESEED,0)重置身份种子

但同样DELETE被完全记录,而TRUNCATE的最小记录并会快很多倍

另一种方法是删除外键约束,然后做一个截断,然后重新创建外键约束

+0

正是我所需要的。我还清除了参考表,速度不是主要要求,因为这是用于自动化测试设置。 – Ophidian 2010-02-05 20:29:58

0

您可以删除外键,截断表,然后重新创建外键。

0

您需要删除约束,截断表格,然后再添加约束。但是,您应该非常小心。如果表中存在行的FK引用将被删除,直到这些行被删除或另一个表中的FK列被清除,您将无法添加它。

1

它被外键引用的事实是您不需要截断表的线索,或者您将创建孤立记录。这就是为什么如果存在外键则不允许截断表。

正确的过程是首先删除引用的记录(如果有的话),然后删除FK约束,然后截断表格然后恢复fk约束。如果你跳过第一步,你将创建一个数据完整性的噩梦,指向oldid 100的记录不会指向碰巧分配给100的新记录,它不是它应该匹配的记录。