我正在使用AdventureWorks进行一些练习。我目前正在试验DML。
但是,有人可以告诉我Truncate
和Delete
之间的主要区别吗?
答案 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)
嗯......让我想想......如果我想到的话,我会增加更多。让我知道如果我错过任何一个,我会添加它们并归功于你。