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作为一个行的所有工作,即他们都是行级别的命令。