直接来自Sql Server 2005 的 MSDN 文档:
您不能在以下表上使用 TRUNCATE TABLE:
- 由 FOREIGN KEY 约束引用。
- 参与索引视图。
- 通过使用事务复制或合并复制发布。
我想要 a 的效果TRUNCATE
(特别是它重置类型列的事实IDENTITY
),但在我的情况下我不能使用一个,因为我的表被数据库中其他地方的外键引用。
更新:这是一个测试配置,我也清除了引用表,所以外键完整性不是问题。
还有什么其他方法可以解决这个问题?
直接来自Sql Server 2005 的 MSDN 文档:
您不能在以下表上使用 TRUNCATE TABLE:
- 由 FOREIGN KEY 约束引用。
- 参与索引视图。
- 通过使用事务复制或合并复制发布。
我想要 a 的效果TRUNCATE
(特别是它重置类型列的事实IDENTITY
),但在我的情况下我不能使用一个,因为我的表被数据库中其他地方的外键引用。
更新:这是一个测试配置,我也清除了引用表,所以外键完整性不是问题。
还有什么其他方法可以解决这个问题?
您可以删除所有行,然后执行 DBCC CHECKIDENT (Tablename, RESEED, 0) 来重置身份种子
但是 DELETE 再次被完全记录,而 TRUNCATE 被最小化记录并且会快很多倍
另一种选择是删除外键约束,然后进行截断,然后重新创建外键约束
它被外键引用的事实是您不需要截断表的线索,否则您将创建孤立记录。这就是为什么如果存在外键则不允许截断表的原因。
正确的过程是首先删除引用的记录(如果有),然后删除 FK 约束,然后截断表,然后恢复 fk 约束。如果您跳过第一步,您将创建一个数据完整性噩梦,其中指向 oldid 100 的记录没有指向恰好分配给 100 的新记录,它不是它应该匹配的记录。
您可以删除外键,截断表,然后重新创建外键。
您将需要删除约束,截断表,然后重新添加约束。但是,您应该对此非常小心。如果表中存在要删除 FK 引用的行,则在删除这些行或清除另一个表中的 FK 列之前,您将无法添加它。