sql server中Delete和Truncate之间的区别。我错了吗?

时间:2010-08-26 14:42:51

标签: sql sql-server

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

然后采访者询问截断是否可以回滚?我没有回复......

面试官说它可以回滚,并要求我详细了解删除和截断的幕后操作细节,然后再查看。

我在这里发布这个问题不只是为了定义和我们所知道的事情......而是为了达到它的核心。对这方面的看法将非常高昂......

提前致谢

4 个答案:

答案 0 :(得分:18)

显然是truncate can't be rolled back is a myth

的想法

摘要

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

那么最后你可以将Truncate作为事务的一部分回滚但不是在提交之后回滚?