Khi làm việc với SQL, DELETE, TRUNCATE và DROP đều có thể khiến dữ liệu “biến mất”. Vì vậy, đây là một trong những nhóm câu lệnh rất dễ bị nhầm lẫn, đặc biệt khi bạn mới làm quen với SQL.
Điểm khác biệt quan trọng nhất có thể nhớ là:
DELETE xóa dữ liệu, TRUNCATE xóa toàn bộ dữ liệu trong bảng, còn DROP xóa cả bảng.
Để dễ hình dung, hãy sử dụng một bảng orders đơn giản:
| id | customer | product | amount |
|---|---|---|---|
| 1 | An | Laptop | 1000 |
| 2 | An | Mouse | 50 |
| 3 | Bình | Laptop | 1000 |
| 4 | Bình | Keyboard | 100 |
| 5 | Cường | Mouse | 50 |
1. DELETE dùng để làm gì?
DELETE được sử dụng để xóa các dòng dữ liệu trong bảng.
Ví dụ, nếu muốn xóa đơn hàng có id = 2:
DELETE FROM orders
WHERE id = 2;
Sau khi thực hiện:
| id | customer | product | amount |
|---|---|---|---|
| 1 | An | Laptop | 1000 |
| 3 | Bình | Laptop | 1000 |
| 4 | Bình | Keyboard | 100 |
| 5 | Cường | Mouse | 50 |
Ở đây chỉ có một dòng bị xóa.
Điểm đáng chú ý là DELETE có thể kết hợp với WHERE để xác định chính xác dữ liệu cần xóa.
Ví dụ:
DELETE FROM orders
WHERE customer = 'An';
Kết quả là tất cả đơn hàng của An bị xóa.
2. Điều gì xảy ra nếu không có WHERE?
Bạn có thể viết:
DELETE FROM orders;
Khi đó, toàn bộ các dòng trong bảng sẽ bị xóa.
Tuy nhiên, bảng orders vẫn tồn tại.
Nói cách khác:
DELETE FROM orders
↓
Xóa các rows
↓
Bảng orders vẫn tồn tại
Bạn vẫn có thể thực hiện:
INSERT INTO orders (...);
sau đó để thêm dữ liệu mới vào bảng.
Đây là điểm quan trọng để phân biệt DELETE với DROP.
3. TRUNCATE dùng để làm gì?
TRUNCATE được sử dụng để xóa toàn bộ dữ liệu trong một bảng.
Ví dụ:
TRUNCATE TABLE orders;
Sau khi thực hiện, bảng không còn dữ liệu:
| id | customer | product | amount |
|---|---|---|---|
Nhưng cấu trúc của bảng vẫn còn.
Có thể hình dung:
orders
┌──────────────────────┐
│ id │
│ customer │
│ product │
│ amount │
└──────────────────────┘
↓
TRUNCATE
↓
┌──────────────────────┐
│ id │
│ customer │
│ product │
│ amount │
└──────────────────────┘
empty table
Vì vậy, sau TRUNCATE, bạn vẫn có thể sử dụng bảng:
INSERT INTO orders (...);
SELECT * FROM orders;
TRUNCATE khác DELETE ở chỗ nó được thiết kế cho việc loại bỏ toàn bộ dữ liệu của bảng, thay vì xóa từng dòng theo điều kiện.
4. DROP dùng để làm gì?
DROP không chỉ xóa dữ liệu.
Nó xóa chính bảng khỏi database.
Ví dụ:
DROP TABLE orders;
Sau khi thực hiện, bảng orders không còn tồn tại.
Database
↓
orders table
↓
DROP TABLE
↓
orders table bị xóa hoàn toàn
Nếu tiếp tục chạy:
SELECT *
FROM orders;
database sẽ báo lỗi vì bảng orders không còn tồn tại.
Đây là điểm khác biệt lớn nhất:
DELETEvàTRUNCATElàm rỗng bảng, cònDROPloại bỏ bảng.
5. So sánh DELETE, TRUNCATE và DROP
| Tiêu chí | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| Xóa dữ liệu | Có | Có | Có |
| Xóa một số dòng | Có | Không | Không |
Dùng WHERE | Có | Không | Không |
| Xóa toàn bộ rows | Có | Có | Có |
| Giữ cấu trúc bảng | Có | Có | Không |
| Bảng còn tồn tại | Có | Có | Không |
| Mục đích chính | Xóa dữ liệu có điều kiện | Làm rỗng bảng | Xóa bảng |
Có thể nhớ nhanh:
DELETE
→ Xóa ROW
TRUNCATE
→ Xóa toàn bộ dữ liệu ROW
DROP
→ Xóa TABLE
6. Một lỗi dễ gặp
Một lỗi khá nguy hiểm là chạy:
DELETE FROM orders;
khi bạn thực sự chỉ muốn xóa một vài dòng.
Ví dụ, nếu muốn xóa đơn hàng của khách hàng An, câu lệnh đúng là:
DELETE FROM orders
WHERE customer = 'An';
Nếu quên WHERE:
DELETE FROM orders;
thì toàn bộ rows trong bảng sẽ bị xóa.
Vì vậy, trước khi thực hiện DELETE, đặc biệt trong môi trường production, bạn nên kiểm tra điều kiện bằng:
SELECT *
FROM orders
WHERE customer = 'An';
Sau khi chắc chắn kết quả đúng mới thực hiện DELETE.
7. Có thể khôi phục dữ liệu sau khi xóa không?
Đây là một câu hỏi thường gặp, nhưng câu trả lời phụ thuộc vào hệ quản trị cơ sở dữ liệu và transaction.
Với DELETE, trong những hệ quản trị hỗ trợ transaction như Oracle, nếu thao tác vẫn nằm trong transaction và chưa COMMIT, có thể sử dụng:
ROLLBACK;
để hoàn tác.
Ví dụ:
DELETE FROM orders
WHERE customer = 'An';
ROLLBACK;
Dữ liệu vừa xóa có thể được khôi phục trong phạm vi transaction đó.
Tuy nhiên, không nên hiểu rằng DELETE luôn có thể khôi phục còn TRUNCATE hay DROP thì luôn không thể. Hành vi cụ thể liên quan đến transaction, database engine và cách câu lệnh được thực hiện.
Với Oracle, TRUNCATE và DROP thuộc nhóm DDL và có hành vi transaction khác với DELETE, vì vậy đây cũng là điểm bạn nên lưu ý nếu đang sử dụng Oracle.
8. Khi nào nên dùng DELETE, TRUNCATE và DROP?
Có thể quyết định bằng ba câu hỏi:
Bạn muốn xóa một số dòng?
DELETE FROM orders
WHERE ...;
Bạn muốn xóa toàn bộ dữ liệu nhưng giữ bảng?
TRUNCATE TABLE orders;
Bạn không cần bảng nữa?
DROP TABLE orders;
Có thể nhớ bằng sơ đồ:
Bạn muốn xóa gì?
│
┌──────────┼──────────┐
↓ ↓ ↓
Một số row Toàn bộ Cả table
│ │ │
DELETE TRUNCATE DROP


