SQL Server中删除和截断的区别是什么?

时间:2015-04-24 02:28:24

标签: sql-server tsql

我正在使用AdventureWorks进行一些练习。我目前正在试验DML。

但是,有人可以告诉我TruncateDelete之间的主要区别吗?

2 个答案:

答案 0 :(得分:2)

  • Truncate用于删除表中的所有值(这有一些限制,例如ex。表不能有外键)

  • 删除是在任何条件下从表中删除值。

通常如果要清理表,Truncate会更快。

希望这有帮助

答案 1 :(得分:2)

这是我的完整清单。有些可能是特定于Oracle的,但其他一般是适用的。有些是显而易见的,但我认为仍然值得说明。

语句类型:删除是DML,Truncate是DDLCommit:删除没有自动提交,截断是自动更新的(实际上,我相信有两个提交)空间回收:删除不恢复空间,Truncate恢复空间(除非你使用REUSE STORAGE子句)行范围:删除只能删除一些行。 Truncate删除除分区上下文中使用的所有行之外的所有行。对象类型:Delete可以应用于cluser内的表和表。 Truncate仅适用于表或整个clusterData对象ID:Delete不会影响数据对象id,但truncate会分配一个新的数据对象id,除非从未对表进行过插入(即使回滚的单个插入也会导致要分配的新数据对象ID。回滚:在某些实现中(例如Oracle)截断不能回滚。闪回:闪回在删除时起作用,但截断在操作之前阻止闪回操作。允许:删除可以被授予在一个表上另一个用户或角色,但截断不能没有使用DROP ANY TABLE grant.Redo / Undo:Delete生成少量重做和大量撤消。截断操作会产生可忽略不计的每个数量。索引:截断操作会使不可用的索引再次可用。删除没有。外键:当启用的外键引用表时,无法应用截断。用delete处理取决于外键的配置锁定:Truncate需要一个独占表锁,delete需要一个共享表lock.Triggers:DML触发器不会触发截断。 (感谢Polara)

嗯......让我想想......如果我想到的话,我会增加更多。让我知道如果我错过任何一个,我会添加它们并归功于你。

Same question