【问题标题】:Difference between Delete and Truncate in sql server. Was I wrong...?sql server中删除和截断的区别。难道我错了……?
【发布时间】:2013-11-15 14:01:49
【问题描述】:

在最近的一次采访中,有人问我两者之间的区别。我回答了我们所知道的一般答案......

面试官接着问 truncate 是否可以回滚?我回答没有...

面试官说可以回滚,让我把delete和truncate这两个幕后操作的细节过一遍,以后再检查。

好吧,我在这里发布这个问题不仅仅是为了定义和我们知道的事情......而是为了了解它的核心。对这方面的关注将受到高度重视......

提前致谢

【问题讨论】:

  • 对我来说听起来像是一个毫无意义的面试问题!
  • 并非毫无意义:与 DELETE 相比,TRUNCATE 可以非常快,但由于其他考虑(IDENTITY、约束和触发器),您可能不想或不能这样做。因此,如果您必须定期清空一个大表(例如数据仓库负载),了解这些差异非常有价值。

标签: sql sql-server


【解决方案1】:

显然truncate can't be rolled back is a myth的想法。

总结

  • 可以从事务中回滚截断。不同之处在于截断被记录为日志中的页面释放,而不是删除每条被删除的记录。操作一旦提交就无法撤消。
  • 截断时,您正在重置标识字段。当你删除时,你不是。
  • 您不能截断被外键引用的表。
  • 截断不会触发任何 ON DELETE 触发器

【讨论】:

  • 这是否取决于 RDBMS 的实现方式?在查看 Oracle 文档时,它非常明确地说 Truncate 不能回滚(stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/…
  • 操作标记为 sql-server 所以这个答案是特定的。我不知道 Oracle 是如何工作的。
  • 虽然技术上准确,但这完全是误导。当有人说“回滚”时,他们不仅指操作的一部分,还指整个操作,作为事务的一部分发生的所有更改,可以说,其中最重要的是数据行。不是页面分配...回滚页面分配很难满足术语 RollBack 的普遍理解含义
  • @Charles - 但是如果你回滚页面释放,你会回滚整个操作。
  • 很好,我不久前写过那篇文章 :-)
【解决方案2】:

截断操作将释放属于该表的所有页面。这些释放被记录并且可以回滚。删除会将所有行标记为已删除,并记录每一行。

【讨论】:

    【解决方案3】:

    如果您在事务中立即执行截断,则可以回滚。它不能像在数据库恢复中那样稍后从事务日志中回滚。在事务中测试它并查看。

    【讨论】:

      【解决方案4】:

      所以最后你可以回滚 Truncate 作为事务的一部分,但不能在提交后回滚?

      【讨论】:

      • 是的,与任何其他 DML 操作相同。如果您更新一个值然后提交,则没有内置方法可以再次取回之前的值。
      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多