VISEN GROUP
Technology & Engineering

DELETE, TRUNCATE và DROP khác nhau thế nào trong SQL?

September 18, 20265 min readUncategorized

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:

idcustomerproductamount
1AnLaptop1000
2AnMouse50
3BìnhLaptop1000
4BìnhKeyboard100
5CườngMouse50

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:

idcustomerproductamount
1AnLaptop1000
3BìnhLaptop1000
4BìnhKeyboard100
5CườngMouse50

Ở đâ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:

idcustomerproductamount

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:

DELETE và TRUNCATE làm rỗng bảng, còn DROP loại bỏ bảng.


5. So sánh DELETE, TRUNCATE và DROP

Tiêu chíDELETETRUNCATEDROP
Xóa dữ liệuCóCóCó
Xóa một số dòngCóKhôngKhông
Dùng WHERECóKhôngKhông
Xóa toàn bộ rowsCóCóCó
Giữ cấu trúc bảngCóCóKhông
Bảng còn tồn tạiCóCóKhông
Mục đích chínhXóa dữ liệu có điều kiệnLàm rỗng bảngXó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

Leave a Reply

Your email address will not be published. Required fields are marked *