Различие между DML и DDL не так ясно, как подразумевают их названия, поэтому иногда все становится немного мутнее.
Oracle четко классифицируется TRUNCATE
как DDL в Руководстве по концепциям, но DELETE
как DML.
Основными моментами, которые ставят TRUNCATE
в лагерь DDL на Oracle, насколько я понимаю, являются:
TRUNCATE
может изменить параметры хранения ( NEXT
параметр), и они являются частью определения объекта - это в лагере DDL.
TRUNCATE
делает неявный commit
, и не может быть откат (без обратной памяти) - большинство (все?) операций DDL в Oracle делают это, никакой DML не делает.
Тот факт, что триггеры TRUNCATE
не ON DELETE
запускаются, также отличает его от обычных операций DML (но некоторые операции DML с прямым путем также пропускают триггеры, так что это неочевидный индикатор).
Та же самая документация отмечает, что DELETE
генерирует UNDO, но TRUNCATE
не генерирует , поэтому ваше утверждение в этом отношении верно. (Обратите внимание, что TRUNCATE
это генерирует некоторые, REDO
так что усечение может быть воспроизведено в случае восстановления / восстановления.) Но некоторыеNOLOGGING
операции также могут привести к уменьшению UNDO (совсем не уверен ни в одном), так что, на мой взгляд, это не является четким показателем.
Итак, я бы подвел итог как:
truncate
не является «транзакционным» в том смысле, что он фиксирует и не может быть откат, и может изменять атрибуты хранилища объектов. Так что это не обычный DML - Oracle классифицирует его как DDL.
delete
это обычный оператор DML.