Câu lệnh DELETE
trong MySQL được sử dụng để xóa dữ liệu từ một bảng. Dưới đây là hướng dẫn chi tiết từ các trường hợp cơ bản đến nâng cao, với các ví dụ cụ thể và minh họa rõ ràng.
1. Cấu trúc cơ bản của câu lệnh DELETE
Cú pháp cơ bản của câu lệnh DELETE
là:
DELETE FROM table_name
WHERE condition;
Trong đó:
table_name
: Tên bảng mà bạn muốn xóa dữ liệu từ đó.
condition
: Điều kiện để xác định các dòng nào sẽ bị xóa.
Nếu không sử dụng WHERE
, tất cả các dòng trong bảng sẽ bị xóa.
Ví dụ cơ bản:
Để xóa một bản ghi cụ thể trong bảng employees
với employee_id = 1
:
DELETE FROM employees
WHERE employee_id = 1;
Câu lệnh trên sẽ xóa dòng có employee_id = 1
khỏi bảng employees
.
2. Xóa nhiều bản ghi dựa trên điều kiện
Bạn có thể xóa nhiều bản ghi cùng một lúc bằng cách sử dụng điều kiện WHERE
.
Ví dụ:
Để xóa tất cả các bản ghi trong bảng employees
với department_id = 2
:
DELETE FROM employees
WHERE department_id = 2;
Câu lệnh trên sẽ xóa tất cả các dòng có department_id = 2
khỏi bảng employees
.
3. Xóa tất cả các bản ghi trong bảng
Để xóa tất cả các bản ghi trong bảng mà không xóa cấu trúc bảng, không nên sử dụng câu lệnh DELETE
mà nên dùng câu lệnh TRUNCATE
. Tuy nhiên, nếu bạn muốn dùng DELETE
:
Ví dụ:
Câu lệnh trên sẽ xóa tất cả các dòng trong bảng employees
, nhưng cấu trúc bảng và các ràng buộc sẽ được giữ nguyên.
4. Xóa dựa trên kết quả của một truy vấn con
Bạn có thể xóa dữ liệu dựa trên kết quả của một truy vấn con.
Ví dụ:
Để xóa các bản ghi trong bảng employees
mà employee_id
không xuất hiện trong bảng salaries
:
DELETE FROM employees
WHERE employee_id NOT IN (
SELECT employee_id
FROM salaries
);
Câu lệnh trên sẽ xóa các bản ghi trong employees
có employee_id
không tồn tại trong bảng salaries
.
5. Xóa với JOIN
Khi bạn cần xóa dữ liệu từ một bảng dựa trên điều kiện liên quan đến nhiều bảng, bạn có thể sử dụng JOIN
.
Ví dụ:
Để xóa tất cả các bản ghi trong bảng employees
mà phòng ban của họ đã bị xóa (dữ liệu trong bảng departments
đã bị xóa):
DELETE e
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.department_id IS NULL;
Câu lệnh trên sẽ xóa các nhân viên thuộc phòng ban đã bị xóa khỏi bảng departments
.
6. Xóa với điều kiện phức tạp
Bạn có thể sử dụng các điều kiện phức tạp trong phần WHERE
của câu lệnh DELETE
.
Ví dụ:
Để xóa các bản ghi trong bảng orders
mà order_date
nằm ngoài khoảng thời gian của tháng hiện tại và có status = 'canceled'
:
DELETE FROM orders
WHERE status = 'canceled'
AND (order_date < DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY)
OR order_date > LAST_DAY(CURDATE()));
Câu lệnh trên sẽ xóa các đơn hàng bị hủy mà nằm ngoài khoảng thời gian của tháng hiện tại.
7. Xóa dựa trên số lượng dòng
Bạn có thể sử dụng LIMIT
để xóa một số lượng cụ thể các bản ghi.
Ví dụ:
Để xóa 5 bản ghi đầu tiên có status = 'inactive'
trong bảng users
:
DELETE FROM users
WHERE status = 'inactive'
LIMIT 5;
Câu lệnh trên sẽ xóa 5 bản ghi đầu tiên trong bảng users
mà có status = 'inactive'
.
8. Xóa dữ liệu với ORDER BY
Sử dụng ORDER BY
cùng với LIMIT
để kiểm soát các bản ghi cụ thể cần xóa theo thứ tự.
Ví dụ:
Để xóa 10 bản ghi có created_at
cũ nhất trong bảng logs
:
DELETE FROM logs
ORDER BY created_at ASC
LIMIT 10;
Câu lệnh trên sẽ xóa 10 bản ghi đầu tiên dựa trên thứ tự ngày tạo (created_at
).
9. Xóa với Trigger
Bạn có thể sử dụng Trigger để tự động xóa dữ liệu từ một bảng khác khi có thay đổi trên bảng hiện tại.
Ví dụ:
Tạo Trigger để tự động xóa bản ghi trong bảng archive
khi bản ghi tương ứng trong bảng main
bị xóa:
CREATE TRIGGER after_delete_main
AFTER DELETE ON main
FOR EACH ROW
BEGIN
DELETE FROM archive
WHERE archive_id = OLD.id;
END;
Trigger này sẽ xóa bản ghi trong bảng archive
khi bản ghi tương ứng trong bảng main
bị xóa.
10. Xóa dữ liệu với khóa chính tự động tăng (AUTO_INCREMENT
)
Khi bạn xóa các bản ghi trong bảng có khóa chính tự động tăng, giá trị tự động tăng không bị thay đổi. Nếu bạn muốn đặt lại giá trị AUTO_INCREMENT
về một giá trị cụ thể, bạn phải sử dụng ALTER TABLE
.
Ví dụ:
Để đặt lại giá trị AUTO_INCREMENT
cho bảng products
:
ALTER TABLE products AUTO_INCREMENT = 1;
Sau khi thực hiện lệnh này, giá trị tiếp theo cho cột AUTO_INCREMENT
sẽ bắt đầu từ 1.
11. Xóa dữ liệu trong cột kiểu JSON
Nếu bạn lưu trữ dữ liệu JSON trong bảng và cần xóa các phần tử cụ thể trong dữ liệu JSON, bạn có thể sử dụng các hàm JSON của MySQL.
Ví dụ:
Giả sử bạn có bảng settings
với cột preferences
kiểu JSON, và bạn muốn xóa một mục trong mảng JSON.
UPDATE settings
SET preferences = JSON_REMOVE(preferences, '$.notifications')
WHERE user_id = 1;
Câu lệnh trên sẽ xóa trường notifications
khỏi đối tượng JSON trong cột preferences
cho người dùng có user_id = 1
.
12. Xóa dữ liệu dựa trên phân vùng (Partitioning)
Nếu bảng của bạn được phân vùng, bạn có thể xóa dữ liệu từ một phân vùng cụ thể.
Ví dụ:
Giả sử bạn có bảng sales
được phân vùng theo tháng, và bạn muốn xóa dữ liệu từ phân vùng tháng 01 của năm 2024:
DELETE FROM sales
PARTITION (p202401);
Câu lệnh trên sẽ xóa dữ liệu từ phân vùng p202401
của bảng sales
.
13. Xóa dữ liệu từ bảng với ràng buộc khóa ngoại
Khi xóa dữ liệu từ bảng có ràng buộc khóa ngoại (FOREIGN KEY
), bạn cần đảm bảo rằng các bản ghi trong các bảng khác cũng được xử lý phù hợp.
Ví dụ:
Nếu bạn có bảng orders
với customer_id
là khóa ngoại tham chiếu đến bảng customers
, và bạn muốn xóa khách hàng và các đơn hàng liên quan:
DELETE o
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id = 10;
Câu lệnh trên sẽ xóa tất cả các đơn hàng và khách hàng có customer_id = 10
.
14. Xóa dữ liệu với IGNORE
Sử dụng từ khóa IGNORE
để bỏ qua các lỗi khi thực hiện câu lệnh DELETE
.
Ví dụ:
DELETE IGNORE FROM employees
WHERE employee_id = 999;
Câu lệnh trên sẽ xóa bản ghi với employee_id = 999
, và nếu có lỗi xảy ra (ví dụ, không tìm thấy bản ghi), câu lệnh sẽ bỏ qua lỗi đó.
Trên đây là hướng dẫn chi tiết về câu lệnh DELETE
trong MySQL với các trường hợp từ cơ bản đến nâng cao. Các ví dụ và kỹ thuật này giúp bạn hiểu rõ hơn cách xóa dữ liệu hiệu quả và an toàn trong MySQL.