Answers:
DML与DDL的区别并不像其名称所暗示的那么清晰,因此有时会变得有些混乱。
Oracle 在《概念指南》中明确归类TRUNCATE
为DDL,但DELETE
归类为DML。
据TRUNCATE
我了解,DDL阵营在Oracle上的要点是:
TRUNCATE
可以更改存储参数(NEXT
参数),这些参数是对象定义的一部分-位于DDL阵营中。TRUNCATE
不执行隐式操作commit
,并且不能回滚(不包括闪回)-Oracle中的大多数(全部)DDL操作都这样做,而DML则不这样做。TRUNCATE
不运行ON DELETE
触发器的事实也将其与常规DML操作区分开(但是某些直接路径DML操作也会跳过触发器,因此尚不清楚)。
相同的文档指出会DELETE
生成UNDO,但TRUNCATE
不会生成,因此您的说法在这方面是正确的。(请注意,TRUNCATE
它确实会生成一些内容,REDO
以便在还原/恢复的情况下可以截断该片段。)但是某些NOLOGGING
操作也会产生减少的UNDO(完全不确定),因此我认为这也不是一个明确的指标。
所以我总结为:
truncate
在提交并且不能回滚,并且可以修改对象存储属性的意义上说,它不是“事务性的”。因此,它不是普通的DML-Oracle将其分类为DDL。delete
是普通的DML语句。我认为这truncate
与drop
,相似alter
,create
因为它们都在表上工作,即它们都是表级命令。而“删除”类似insert
,select
,update
作为一个行的所有工作,即他们都是行级别的命令。