Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

DROP TABLE vs TRUNCATE TABLE trong MySQL: Xóa hoàn toàn hay chỉ xóa dữ liệu?

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ểmDROP TABLETRUNCATE TABLE
Xóa dữ liệuCó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_INCREMENTN/A (bảng mất)Có (về 1)
Kích hoạt TRIGGER (BEFORE/AFTER DELETE)KhôngKhông
Có thể ROLLBACK (trong transaction)Không (DDL tự commit)Không (DDL tự commit)
Hiệu năngNhanh (xóa file .frm/.ibd)Rất nhanh (deallocate data pages)
Quyền cần thiếtDROP privilegeDROP 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 table rấ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.