【问题标题】:What is the equivalent effect to Truncating a table, when the table is referenced by a foreign-key当表被外键引用时,截断表的等效效果是什么
【发布时间】:2010-02-05 19:32:45
【问题描述】:

直接出MSDN docs for Sql Server 2005

您不能在以下表上使用 TRUNCATE TABLE:

  • 被 FOREIGN KEY 约束引用。
  • 参与索引视图。
  • 使用事务复制或合并复制发布。

我想要TRUNCATE 的效果(特别是它重置IDENTITY 类型列的事实),但我不能在我的情况下使用它,因为我的表被数据库中其他地方的外键引用.

更新:这是一个测试配置,我也在清除引用表,因此外键完整性不是问题。

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

【问题讨论】:

    标签: sql-server-2005 foreign-keys identity truncate


    【解决方案1】:

    您可以删除所有行,然后执行 DBCC CHECKIDENT (Tablename, RESEED, 0) 来重置身份种子

    但 DELETE 再次被完全记录,而 TRUNCATE 被最低限度地记录并且会快很多倍

    另一种选择是删除外键约束,然后进行截断,然后重新创建外键约束

    【讨论】:

    • 正是我所需要的。我还清理了参考表,速度不是主要要求,因为这是用于自动化测试设置。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您需要删除约束,截断表,然后重新添加约束。但是,您应该对此非常小心。如果表中存在要删除 FK 引用的行,则在删除这些行或清除另一个表中的 FK 列之前,您将无法添加它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-07
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-30
          • 2019-11-04
          相关资源
          最近更新 更多