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 DELETElà DML.
Những điểm chính đưa TRUNCATEvào trại DDL trên Oracle, như tôi hiểu, là:
TRUNCATEcó thể thay đổi các tham số lưu trữ ( NEXTtham số) và đó là một phần của định nghĩa đối tượng - đó là trong trại DDL.
TRUNCATEthực hiện một ẩn commitvà 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à TRUNCATEkhông ON DELETEkí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 ý DELETEtạo ra UNDO, nhưng TRUNCATEkhô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 TRUNCATEkhông tạo ra một số REDOsao 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ố NOLOGGINGhoạ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:
truncatekhô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.