.## 1. Lệnh TRUNCATE là gì?
Khái niệm cơ bản của lệnh TRUNCATE
Lệnh TRUNCATE trong MySQL là một câu lệnh được sử dụng để xóa toàn bộ dữ liệu trong một bảng một cách đồng thời. Không giống như câu lệnh DELETE, vốn xóa các hàng riêng lẻ, TRUNCATE xóa dữ liệu bằng cách tái tạo lại bảng nội bộ. Do đó, nó cực kỳ hiệu quả khi loại bỏ một lượng lớn dữ liệu một cách nhanh chóng.
Cú pháp cơ bản
Cú pháp cơ bản của lệnh TRUNCATE như sau:
TRUNCATE TABLE table_name;
Lệnh này sẽ xóa tất cả các hàng trong bảng được chỉ định và đưa bảng về trạng thái ban đầu. Tuy nhiên, vì dữ liệu đã xóa không thể khôi phục, nên cần sử dụng lệnh này một cách thận trọng.
Ví dụ: Sử dụng cơ bản
Trong ví dụ sau, một bảng có tên users được tạo, và lệnh TRUNCATE được sử dụng để xóa toàn bộ dữ liệu của nó.
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');
-- Execute TRUNCATE
TRUNCATE TABLE users;
-- The table becomes empty, and AUTO_INCREMENT is reset.
Trong ví dụ này, toàn bộ dữ liệu trong bảng bị xóa, và khi chèn dữ liệu mới, cột id sẽ bắt đầu lại từ 1.

2. Sự khác nhau giữa TRUNCATE và DELETE
Sự khác nhau về tốc độ và hiệu năng
TRUNCATE được tối ưu đặc biệt để xóa toàn bộ dữ liệu của một bảng, do đó nhanh hơn nhiều so với DELETE. Vì DELETE xóa các hàng riêng lẻ, nên khi xử lý một số lượng lớn hàng, nó có thể chậm. Ngược lại, TRUNCATE xóa dữ liệu bằng cách tái tạo lại bảng nội bộ, khiến nó cực kỳ hiệu quả khi xóa khối lượng dữ liệu lớn.
Ví dụ: So sánh hiệu năng
Khi xóa hàng triệu hàng, câu lệnh DELETE sẽ được viết như sau:
DELETE FROM users WHERE condition;
Ngược lại, sử dụng TRUNCATE cho phép bạn xóa tất cả các hàng một lần:
TRUNCATE TABLE users;
Sự khác biệt trở nên rõ rệt hơn khi bảng rất lớn. Các thao tác mất thời gian đáng kể với DELETE có thể hoàn thành gần như ngay lập tức với TRUNCATE.
Sự khác nhau về khả năng rollback
Lệnh TRUNCATE không thể được rollback. Khi thực thi, dữ liệu bị xóa vĩnh viễn và không thể khôi phục. Ngược lại, khi DELETE được sử dụng trong một giao dịch, nó có thể được rollback nếu xảy ra lỗi, cho phép dữ liệu được phục hồi. Đây là một sự khác biệt quan trọng về mặt an toàn.
Sự khác nhau về xóa có chọn lọc
Câu lệnh DELETE cho phép bạn xóa các hàng dựa trên các điều kiện cụ thể bằng mệnh đề WHERE, nhưng TRUNCATE không hỗ trợ xóa có chọn lọc. Ví dụ, nếu bạn muốn xóa chỉ một người dùng cụ thể, bạn sẽ sử dụng DELETE như dưới đây:
DELETE FROM users WHERE id = 1;
Vì TRUNCATE xóa tất cả các hàng, nên DELETE phù hợp hơn khi bạn cần xóa chỉ các bản ghi cụ thể.
3. Ảnh hưởng của TRUNCATE đến AUTO_INCREMENT
Đặt lại AUTO_INCREMENT
Khi bạn sử dụng lệnh TRUNCATE, toàn bộ dữ liệu trong bảng bị xóa và giá trị AUTO_INCREMENT được đặt lại đồng thời. Điều này có nghĩa là khi chèn dữ liệu mới, ID sẽ bắt đầu lại từ 1. Ví dụ, nếu bạn chèn dữ liệu mới vào bảng users, nó sẽ trông như sau:
INSERT INTO users (name) VALUES ('Ken');
-- The id starts again from 1
Việc đặt lại này có thể tiện lợi trong một số tình huống. Tuy nhiên, cần thận trọng, đặc biệt khi các ID được sử dụng làm khóa ngoại trong các bảng khác. Các bất nhất dữ liệu không mong muốn có thể xảy ra, vì vậy hãy cân nhắc kỹ các hệ quả trước khi sử dụng TRUNCATE.
4. Các lưu ý quan trọng khi sử dụng TRUNCATE
Dữ liệu không thể khôi phục
Rủi ro lớn nhất của lệnh TRUNCATE là dữ liệu không thể khôi phục. Nếu dữ liệu quan trọng bị xóa nhầm, không thể phục hồi. Do đó, nên sao lưu dữ liệu của bạn trước khi thực thi lệnh này.
Ràng buộc khóa ngoại
Câu lệnh TRUNCATE không thể được sử dụng trên các bảng có ràng buộc khóa ngoại được kích hoạt. Trong những trường hợp như vậy, bạn phải loại bỏ ràng buộc khóa ngoại trước hoặc xử lý dữ liệu liên quan thông qua các phương pháp khác.
Quyền Thực Thi
Để thực thi câu lệnh TRUNCATE, bạn phải có quyền xóa bảng (quyền DROP). Người dùng không có quyền cần thiết không thể chạy lệnh này, vì vậy hãy đảm bảo xác minh các quyền phù hợp trước.

5. Khi Nào Sử Dụng TRUNCATE so Với DELETE
Khi Bạn Nên Sử Dụng TRUNCATE
TRUNCATE phù hợp khi bạn cần xóa toàn bộ bảng một lần. Nó đặc biệt hữu ích khi bạn muốn xóa tất cả dữ liệu nhanh chóng hoặc khi việc đặt lại AUTO_INCREMENT là mong muốn. Ví dụ, nó lý tưởng khi bạn muốn đặt lại dữ liệu kiểm tra lặp lại.
Khi Bạn Nên Sử Dụng DELETE
Mặt khác, nếu cần xóa hàng chọn lọc hoặc thực thi trigger, bạn nên sử dụng câu lệnh DELETE. Khi xóa dữ liệu dựa trên các điều kiện cụ thể hoặc duy trì tính toàn vẹn cơ sở dữ liệu một cách an toàn, DELETE phù hợp hơn.
6. Các Thực Hành Tốt Nhất Để Sử Dụng TRUNCATE Một Cách An Toàn
Tầm Quan Trọng Của Sao Lưu
Trước khi thực thi câu lệnh TRUNCATE, việc tạo sao lưu dữ liệu là rất cần thiết. Vì mất dữ liệu do xóa nhầm không thể đảo ngược, cần thận trọng thêm, đặc biệt trong môi trường sản xuất.
Xác Minh Trong Môi Trường Kiểm Thử
Trước khi chạy TRUNCATE trong môi trường sản xuất, khuyến nghị kiểm tra nó trong môi trường phát triển hoặc staging. Điều này cho phép bạn xác nhận rằng nó hoạt động như mong đợi và giúp ngăn ngừa các vấn đề bất ngờ.
Quản Lý Cột AUTO_INCREMENT
Vì TRUNCATE đặt lại AUTO_INCREMENT, nếu việc duy trì tính nhất quán ID duy nhất là quan trọng, bạn nên xác minh sao lưu dữ liệu và mối quan hệ với các bảng khác trước khi thực thi nó.


