Hai câu lệnh này đều xóa dữ liệu nhưng có khác biệt căn bản về cấu trúc bảng, khóa chính, trigger, quyền và hiệu năng.
DROP TABLE: Xóa hoàn toàn bảng (cấu trúc + dữ liệu + index + trigger + quyền)
mysql> CREATE TABLE DemoTable (Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(20));
mysql> INSERT INTO DemoTable (Name) VALUES ('Larry'), ('Chris');
mysql> DROP TABLE DemoTable;
Query OK, 0 rows affected (0.18 sec)
mysql> SELECT * FROM DemoTable;
ERROR 1146 (42S02): Table 'hb_student_tracker.DemoTable' doesn't exist
mysql> DESC DemoTable;
ERROR 1146 (42S02): Table 'hb_student_tracker.DemoTable' doesn't exist
Bảng không còn tồn tại. Cần CREATE TABLE lại hoàn toàn.
TRUNCATE TABLE: Xóa toàn bộ dữ liệu, GIỮ NGUYÊN cấu trúc bảng
mysql> CREATE TABLE DemoTable (Id INT PRIMARY KEY AUTO_INCREMENT, FirstName VARCHAR(20));
mysql> INSERT INTO DemoTable (FirstName) VALUES ('Chris'), ('Robert');
mysql> TRUNCATE TABLE DemoTable;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM DemoTable;
Empty set (0.00 sec)
mysql> DESC DemoTable;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| FirstName | varchar(20) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
Cấu trúc bảng vẫn còn. Auto_increment reset về 1.
Bảng so sánh chi tiết
| Đặc điểm | DROP TABLE | TRUNCATE TABLE |
|---|---|---|
| Xóa dữ liệu | Có | Có |
| Xóa cấu trúc bảng (định nghĩa cột, index, FK, trigger) | Có | Không (giữ nguyên) |
| Reset AUTO_INCREMENT | N/A (bảng mất) | Có (về 1) |
| Kích hoạt TRIGGER (BEFORE/AFTER DELETE) | Không | Không |
| Có thể ROLLBACK (trong transaction) | Không (DDL tự commit) | Không (DDL tự commit) |
| Hiệu năng | Nhanh (xóa file .frm/.ibd) | Rất nhanh (deallocate data pages) |
| Quyền cần thiết | DROP privilege | DROP privilege (MySQL 5.7+) / DELETE privilege (cũ) |
Khi nào dùng cái nào?
- DROP TABLE: Không còn cần bảng nữa, muốn dọn dẹp hoàn toàn (schema migration, xóa bảng tạm).
- TRUNCATE TABLE: Cần xóa sạch dữ liệu để nạp lại (reload data), giữ cấu trúc cho ứng dụng tiếp tục dùng. Nhanh hơn
DELETE FROM tablerất nhiều. - DELETE FROM table: Cần xóa có điều kiện (
WHERE), cần kích hoạt trigger, cần rollback.