FresherKỹ thuậtSQL
DELETE, TRUNCATE và DROP khác nhau như thế nào?
Thử trả lời trước
Đáp án mẫu
Cả ba đều xóa dữ liệu, nhưng ở mức khác nhau.
- DELETE xóa các dòng, có thể lọc bằng
WHERE. Đây là câu lệnh DML, kích hoạt trigger mức dòng và có thể rollback. Nó xử lý từng dòng nên với bảng lớn thì chậm và ghi nhiều log. - TRUNCATE làm rỗng toàn bộ bảng một lần và không có
WHERE. Nó nhanh hơn nhiều vì không xử lý từng dòng, và thường reset bộ đếm identity hoặc auto-increment. Đây là DDL: trong PostgreSQL và SQL Server nó rollback được bên trong transaction, còn trong MySQL và Oracle nó commit ngầm. Nó cũng không kích hoạt trigger delete mức dòng và bị chặn nếu có foreign key trỏ tới bảng. - DROP xóa chính cái bảng: dữ liệu, cấu trúc, index và quyền.
DELETE FROM sessions WHERE expires_at < NOW();
TRUNCATE TABLE staging_events;
DROP TABLE old_reports;
Dùng DELETE để xóa một số dòng, TRUNCATE để reset cả bảng, và chỉ DROP khi bảng không còn cần tồn tại.
Ý chính
- DELETE là DML mức dòng, có WHERE, trigger và rollback
- TRUNCATE làm rỗng bảng nhanh và thường reset identity
- Khả năng rollback của TRUNCATE tùy engine
- DROP xóa cả định nghĩa của bảng
Câu hỏi nối tiếp thường gặp
- Vì sao TRUNCATE có thể lỗi trên bảng có foreign key?
Lỗi thường gặp
- Cho rằng TRUNCATE luôn rollback được
- Dùng DELETE không có WHERE để xóa một bảng rất lớn