Tin tức và phân tích của tất cả các thiết bị di động

TRUNCATE vs. DELETE trong SQL: Tìm hiểu sự khác biệt

Tìm hiểu cách hoạt động của các câu lệnh TRUNCATE và DELETE trong SQL, sự khác biệt là gì và khi nào nên sử dụng câu lệnh này.

Khi làm việc với các bảng cơ sở dữ liệu, bạn có thể cần xóa một tập hợp con các hàng hoặc tất cả các hàng. Để xóa các hàng khỏi bảng cơ sở dữ liệu, bạn có thể sử dụng câu lệnh SQL TRUNCATE hoặc DELETE, tùy thuộc vào trường hợp sử dụng của bạn.

Trong hướng dẫn này, chúng ta sẽ xem xét kỹ hơn từng câu lệnh, hiểu cách chúng hoạt động và quyết định khi nào nên sử dụng TRUNCATE hơn DELETE và ngược lại.

Trước khi tiếp tục, chúng ta nên xem lại các tập hợp con SQL sau:

  • Các câu lệnh ngôn ngữ định nghĩa dữ liệu (DDL) được sử dụng để tạo và quản lý các đối tượng cơ sở dữ liệu, chẳng hạn như bảng. Các câu lệnh SQL CREATE, DROP và TRUNCATE là ví dụ về câu lệnh DDL.
  • Các câu lệnh Ngôn ngữ thao tác dữ liệu (DML) được sử dụng để thao tác dữ liệu trong các đối tượng cơ sở dữ liệu. Câu lệnh DML được sử dụng để thực hiện các thao tác tạo, đọc, cập nhật và xóa bản ghi.
  • Các câu lệnh Ngôn ngữ truy vấn dữ liệu (DQL) được sử dụng để truy xuất dữ liệu từ các bảng cơ sở dữ liệu. Tất cả các câu lệnh SELECT đều thuộc về một thành viên của DQL.

Cách sử dụng câu lệnh TRUNCATE trong SQL

Cú pháp câu lệnh TRUNCATE trong SQL

Cú pháp của câu lệnh TRUNCATE trong SQL như sau:

TRUNCATE TABLE table_name;

Chạy lệnh TRUNCATE ở trên sẽ xóa tất cả các hàng trong bảng được chỉ định bởi table_name – và không xóa bảng.

Thao tác cắt bớt không quét tất cả các bản ghi trong bảng. Vì vậy, nó tương đối nhanh hơn khi làm việc với các bảng cơ sở dữ liệu lớn.

Một ví dụ sử dụng SQL TRUNCATE

📑 Lưu ý: Nếu bạn đã cài đặt MySQL trên máy tính, bạn có thể viết mã bằng ứng dụng khách dòng lệnh MySQL. Bạn cũng có thể theo dõi trong một DBMS khác mà bạn chọn, chẳng hạn như PostgreSQL.

Đầu tiên, hãy tạo một cơ sở dữ liệu để làm việc:

mysql> CREATE DATABASE db1;
Query OK, 1 row affected (1.50 sec)

Sau đó chọn cơ sở dữ liệu chúng ta vừa tạo:

mysql> use db1;
Database changed

Bước tiếp theo là tạo một bảng cơ sở dữ liệu. Chạy câu lệnh CREATE TABLE sau để tạo một bảng công việc đơn giản:

-- Create the tasks table
CREATE TABLE tasks (
    task_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    due_date DATE,
    status ENUM('Pending', 'In Progress', 'Completed') DEFAULT 'Pending',
    assignee VARCHAR(100)
);

Trong ví dụ này, bảng nhiệm vụ chứa các cột sau:

  • task_id: Tự động tăng ID duy nhất cho từng tác vụ.
  • title: Tiêu đề hoặc tên công việc, giới hạn ở 255 ký tự.
  • do_due: Ngày đến hạn của nhiệm vụ, được biểu thị dưới dạng ngày.
  • trạng thái: Trạng thái của nhiệm vụ, có thể là “Đang chờ xử lý”, “Đang tiến hành” hoặc “Đã hoàn thành”. Mặc định là “Đang chờ xử lý”.
  • người được giao: người được giao cho một nhiệm vụ cụ thể.

Bây giờ chúng ta đã tạo bảng nhiệm vụ, hãy chèn các bản ghi vào đó:

-- Inserting multiple records into the tasks table
INSERT INTO tasks (title, due_date, status, assignee)
VALUES
    ('Task 1', '2023-08-10', 'Pending', 'John'),
    ('Task 2', '2023-08-11', 'In Progress', 'Jane'),
    ('Task 3', '2023-08-12', 'Completed', 'Mike'),
    ('Task 4', '2023-08-13', 'Pending', 'Alice'),
    ('Task 5', '2023-08-14', 'In Progress', 'Bob'),
    ('Task 6', '2023-08-15', 'Completed', 'Emily'),
    ('Task 7', '2023-08-16', 'Pending', 'David'),
    ('Task 8', '2023-08-17', 'In Progress', 'Olivia'),
    ('Task 9', '2023-08-18', 'Pending', 'Daniel'),
    ('Task 10', '2023-08-19', 'Completed', 'Sophia'),
    ('Task 11', '2023-08-20', 'Pending', 'Matthew'),
    ('Task 12', '2023-08-21', 'In Progress', 'Ava'),
    ('Task 13', '2023-08-22', 'Completed', 'William'),
    ('Task 14', '2023-08-23', 'Pending', 'Ella'),
    ('Task 15', '2023-08-24', 'In Progress', 'James'),
    ('Task 16', '2023-08-25', 'Completed', 'Lily'),
    ('Task 17', '2023-08-26', 'Pending', 'Benjamin'),
    ('Task 18', '2023-08-27', 'In Progress', 'Mia'),
    ('Task 19', '2023-08-28', 'Pending', 'Henry'),
    ('Task 20', '2023-08-29', 'Completed', 'Isabella');

Sau khi chạy câu lệnh chèn, bạn sẽ thấy kết quả tương tự:

Query OK, 20 rows affected (0.18 sec)
Records: 20  Duplicates: 0  Warnings: 0

Bây giờ hãy chạy lệnh bảng TRUNCATE để xóa tất cả bản ghi khỏi bảng tác vụ:

TRUNCATE TABLE tasks;
Query OK, 0 rows affected (0.72 sec)

Điều này sẽ xóa tất cả các bản ghi, không phải bảng. Bạn có thể xác minh điều này bằng cách chạy SHOW TABLES; như thế này:

SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| tasks         |
+---------------+
1 row in set (0.00 sec)

Và truy vấn SELECT để tìm nạp dữ liệu từ bảng tác vụ trả về một tập hợp trống:

SELECT * FROM tasks;
Empty set (0.00 sec)

Cách sử dụng câu lệnh SQL DELETE

Cú pháp câu lệnh SQL DELETE

Cú pháp chung của câu lệnh SQL DELETE như sau:

DELETE FROM table_name 
WHERE condition;

Điều kiện trong mệnh đề WHERE là một vị từ chỉ định hàng nào sẽ bị xóa. Câu lệnh DELETE xóa tất cả các hàng mà vị từ đánh giá là True.

Do đó, câu lệnh DELETE cung cấp cho bạn nhiều quyền kiểm soát hơn đối với những bản ghi cần xóa.

Nhưng điều gì sẽ xảy ra khi bạn sử dụng câu lệnh DELETE mà không có mệnh đề WHERE?🤔

DELETE FROM table_name;

Chạy câu lệnh DELETE như minh họa sẽ xóa tất cả các hàng khỏi bảng cơ sở dữ liệu.

Nếu câu lệnh DELETE hoặc tập hợp câu lệnh DELETE là một phần của giao dịch không được cam kết, bạn có thể hoàn tác các thay đổi. Tuy nhiên, bạn nên sao lưu dữ liệu của mình ở nơi khác.

Ví dụ sử dụng DELETE SQL

Bây giờ hãy xem hoạt động của câu lệnh loại bỏ SQL.

Chúng tôi đã xóa tất cả các bản ghi khỏi bảng công việc. Vì vậy, bạn có thể chạy lại câu lệnh INSERT (mà chúng tôi đã chạy trước đó) để chèn các bản ghi:

-- Inserting multiple records into the tasks table
INSERT INTO tasks (title, due_date, status, assignee)
VALUES
    ('Task 1', '2023-08-10', 'Pending', 'John'),
    ('Task 2', '2023-08-11', 'In Progress', 'Jane'),
    ('Task 3', '2023-08-12', 'Completed', 'Mike'),
    ...
    ('Task 18', '2023-08-27', 'In Progress', 'Mia'),
    ('Task 19', '2023-08-28', 'Pending', 'Henry'),
    ('Task 20', '2023-08-29', 'Completed', 'Isabella');

Đầu tiên, hãy sử dụng câu lệnh DELETE với mệnh đề WHERE. Truy vấn sau đây sẽ xóa tất cả các hàng có trạng thái là “Đã hoàn thành”:

DELETE FROM tasks WHERE status="Completed";
Query OK, 6 rows affected (0.14 sec)

Bây giờ hãy chạy truy vấn CHỌN này:

SELECT * FROM tasks;

Bạn sẽ thấy hiện tại có 14 hàng:

+---------+---------+------------+-------------+----------+
| task_id | title   | due_date   | status      | assignee |
+---------+---------+------------+-------------+----------+
|       1 | Task 1  | 2023-08-10 | Pending     | John     |
|       2 | Task 2  | 2023-08-11 | In Progress | Jane     |
|       4 | Task 4  | 2023-08-13 | Pending     | Alice    |
|       5 | Task 5  | 2023-08-14 | In Progress | Bob      |
|       7 | Task 7  | 2023-08-16 | Pending     | David    |
|       8 | Task 8  | 2023-08-17 | In Progress | Olivia   |
|       9 | Task 9  | 2023-08-18 | Pending     | Daniel   |
|      11 | Task 11 | 2023-08-20 | Pending     | Matthew  |
|      12 | Task 12 | 2023-08-21 | In Progress | Ava      |
|      14 | Task 14 | 2023-08-23 | Pending     | Ella     |
|      15 | Task 15 | 2023-08-24 | In Progress | James    |
|      17 | Task 17 | 2023-08-26 | Pending     | Benjamin |
|      18 | Task 18 | 2023-08-27 | In Progress | Mia      |
|      19 | Task 19 | 2023-08-28 | Pending     | Henry    |
+---------+---------+------------+-------------+----------+
14 rows in set (0.00 sec)

Việc chạy câu lệnh DELETE sau sẽ xóa tất cả 14 bản ghi còn lại trong bảng:

DELETE FROM tasks;
Query OK, 14 rows affected (0.20 sec)

Và bảng nhiệm vụ hiện trống rỗng:

SELECT * FROM tasks;
Empty set (0.00 sec)

Câu lệnh DROP của SQL

Cho đến nay chúng ta đã học được:

  • Câu lệnh TRUNCATE xóa tất cả các hàng khỏi bảng.
  • Câu lệnh DELETE – không có mệnh đề WHERE – sẽ xóa tất cả bản ghi khỏi bảng.

Tuy nhiên, câu lệnh TRUNCATE và DELETE không xóa bảng. Nếu bạn muốn xóa một bảng khỏi cơ sở dữ liệu, bạn có thể sử dụng lệnh DROP TABLE như sau:

DROP TABLE table_name;

Bây giờ hãy xóa bảng công việc khỏi cơ sở dữ liệu:

mysql> DROP TABLE tasks;
Query OK, 0 rows affected (0.43 sec)

Bạn sẽ thấy BẢNG HIỂN THỊ; trả về một tập hợp trống (vì chúng tôi đã xóa bảng duy nhất có trong cơ sở dữ liệu):

mysql> SHOW TABLES;
Empty set (0.00 sec)

Khi nào nên sử dụng TRUNCATE so với DELETE trong SQL

FeatureTRUNCATEDELETEScú phápTRUNCATE TABLE table_name;Với mệnh đề WHERE: DELETE FROM table_name WHERE condition;
Không có mệnh đề WHERE: DELETE TABLE table_name; Hiệu ứng Ngôn ngữ định nghĩa dữ liệu tập hợp con SQL (DDL) Ngôn ngữ thao tác dữ liệu (DML) Xóa tất cả các hàng trong bảng cơ sở dữ liệu. Khi chạy mà không có mệnh đề WHERE, câu lệnh DELETE sẽ xóa tất cả bản ghi trong bảng cơ sở dữ liệu. Hiệu suất Hiệu quả hơn DELETE khi làm việc với các bảng lớn. Kém hiệu quả hơn câu lệnh TRUNCATE.

Tóm lại:

  • Khi bạn cần xóa tất cả các hàng khỏi một bảng cơ sở dữ liệu lớn, hãy sử dụng câu lệnh TRUNCATE.
  • Để xóa một tập hợp con các hàng dựa trên các điều kiện cụ thể, hãy sử dụng câu lệnh DELETE.

Tóm lại

Hãy kết thúc cuộc thảo luận của chúng ta bằng một bản tóm tắt:

  • Khi làm việc với các bảng cơ sở dữ liệu, bạn có thể muốn xóa một tập hợp con các hàng hoặc tất cả các hàng trong một bảng cụ thể. Bạn có thể sử dụng câu lệnh TRUNCATE hoặc DELETE để thực hiện việc này.
  • Câu lệnh TRUNCATE có cú pháp sau: TRUNCATE TABLE table_name;. Xóa tất cả các hàng trong bảng được chỉ định bởi table_name, nhưng không xóa chính bảng đó.
  • Câu lệnh DELETE có cú pháp sau: DELETE FROM table_name WHERE condition;. Thao tác này sẽ loại bỏ các hàng có điều kiện vị ngữ là đúng.
  • Việc chạy câu lệnh SQL DELETE mà không có mệnh đề WHERE sẽ xóa tất cả các hàng trong bảng. Vì vậy, về mặt chức năng, điều này đạt được kết quả tương tự như câu lệnh TRUNCATE trong SQL.
  • Chạy TRUNCATE đặc biệt nhanh hơn khi làm việc với các bảng lớn hơn vì nó không quét toàn bộ bảng. Vì vậy, khi bạn cần xóa tất cả các hàng trong một bảng cơ sở dữ liệu lớn, việc chạy cắt ngắn có thể hiệu quả hơn.
  • Khi bạn cần xóa một tập hợp con các hàng dựa trên một điều kiện cụ thể, bạn có thể sử dụng câu lệnh SQL DELETE.

Để biết tổng quan nhanh về các lệnh SQL được sử dụng thường xuyên, hãy xem bảng tóm tắt SQL này.

Mục lục