Sự khác biệt giữa DML và DDL không rõ ràng như tên của chúng, vì vậy đôi khi mọi thứ trở nên hơi lầy lội.
Oracle phân loạiTRUNCATE
rõ ràng là DDL trong Hướng dẫn về khái niệm, nhưng DELETE
là DML.
Những điểm chính đưa TRUNCATE
vào trại DDL trên Oracle, như tôi hiểu, là:
TRUNCATE
có thể thay đổi các tham số lưu trữ ( NEXT
tham số) và đó là một phần của định nghĩa đối tượng - đó là trong trại DDL.
TRUNCATE
thực hiện một ẩn commit
và không thể được khôi phục (flashback sang một bên) - hầu hết (tất cả?) các hoạt động DDL trong Oracle làm điều này, không có DML nào.
Thực tế là TRUNCATE
không ON DELETE
kích hoạt các trình kích hoạt cũng làm cho nó khác biệt với các hoạt động DML thông thường (nhưng một số hoạt động DML đường dẫn trực tiếp cũng bỏ qua các trình kích hoạt, vì vậy đó không phải là một chỉ báo rõ ràng).
Cùng một tài liệu lưu ý DELETE
tạo ra UNDO, nhưng TRUNCATE
không, vì vậy tuyên bố của bạn là chính xác trong khía cạnh này. (Lưu ý rằng TRUNCATE
không tạo ra một số REDO
sao cho cắt ngắn có thể được thực hiện lại trong trường hợp khôi phục / phục hồi.) Nhưng một số NOLOGGING
hoạt động cũng có thể sản xuất giảm UNDO (không chắc chắn về không có gì cả), do đó không phải là một dấu hiệu rõ ràng hoặc là theo ý kiến của tôi.
Vì vậy, tôi tổng hợp nó thành:
truncate
không phải là "giao dịch" theo nghĩa là nó cam kết và không thể khôi phục và có thể sửa đổi các thuộc tính lưu trữ đối tượng. Vì vậy, nó không phải là DML thông thường - Oracle phân loại nó là DDL.
delete
là một tuyên bố DML thông thường.