Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Xóa bản ghi MySQL loại trừ một số giá trị với NOT IN


Giới thiệu

Dùng DELETE ... WHERE column NOT IN (value1, value2...) để xóa tất cả bản ghi **trừ** các giá trị liệt kê.

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    FirstName VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES 
('Chris'), ('Robert'), ('Mike'), ('Sam'), ('David');

Xem dữ liệu trước

mysql> SELECT * FROM DemoTable;
+-----------+
| FirstName |
+-----------+
| Chris     |
| Robert    |
| Mike      |
| Sam       |
| David     |
+-----------+

Xóa trừ 'Robert' và 'Mike'

mysql> DELETE FROM DemoTable WHERE FirstName NOT IN ('Robert', 'Mike');
Query OK, 3 rows affected (0.17 sec)

Kết quả sau xóa

mysql> SELECT * FROM DemoTable;
+-----------+
| FirstName |
+-----------+
| Robert    |
| Mike      |
+-----------+

⚠️ Cảnh báo quan trọng về NULL

Nếu cột có giá trị NULL, NOT IN sẽ **không khớp** và **không xóa** dòng đó (vì NULL NOT IN (...) = UNKNOWN).

-- Nếu có dòng FirstName = NULL
DELETE FROM DemoTable WHERE FirstName NOT IN ('Robert', 'Mike');
-- Dòng NULL sẽ KHÔNG bị xóa!

Giải pháp an toàn với NULL

DELETE FROM DemoTable 
WHERE FirstName NOT IN ('Robert', 'Mike') 
   OR FirstName IS NULL;  -- Xóa luôn NULL nếu muốn

-- Hoặc dùng NOT EXISTS (an toàn hơn với subquery phức tạp)
DELETE FROM DemoTable d
WHERE NOT EXISTS (
    SELECT 1 FROM (SELECT 'Robert' AS n UNION SELECT 'Mike') keep
    WHERE keep.n = d.FirstName
);

Lưu ý

  • Luôn backup hoặc test với SELECT trước khi DELETE.
  • NOT IN với subquery trả về NULL cũng có vấn đề tương tự. Ưu tiên NOT EXISTS.