Giải pháp: DELETE với WHERE NOT
Sử dụng WHERE column != value hoặc WHERE NOT (column = value).
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Subject VARCHAR(100)
);
mysql> INSERT INTO DemoTable(Subject) VALUES('MySQL'), ('MongoDB'), ('Java');
Dữ liệu gốc
+----+---------+ | Id | Subject | +----+---------+ | 1 | MySQL | | 2 | MongoDB | | 3 | Java | +----+---------+
Xóa tất cả KHỎI 'MongoDB'
mysql> DELETE FROM DemoTable WHERE Subject != 'MongoDB';
Kết quả
+----+---------+ | Id | Subject | +----+---------+ | 2 | MongoDB | +----+---------+
Các cách viết tương đương
| Cú pháp | Giải thích |
|---|---|
WHERE Subject != 'MongoDB' | Khác giá trị (standard) |
WHERE Subject <> 'MongoDB' | Khác giá trị (ANSI SQL) |
WHERE NOT (Subject = 'MongoDB') | Phủ định bằng |
WHERE Subject NOT IN ('MongoDB') | Dùng NOT IN (mở rộng nhiều giá trị) |
⚠️ Cảnh báo quan trọng
- Không có WHERE → XÓA TẤT CẢ DÒNG
- NULL:
NULL != 'MongoDB'trả về UNKNOWN (không TRUE) → dòng NULL KHÔNG bị xóa - Luôn TEST SELECT trước:
SELECT * FROM DemoTable WHERE Subject != 'MongoDB';
An toàn hơn: Dùng Primary Key
-- Giữ lại Id = 2 DELETE FROM DemoTable WHERE Id != 2;
Xóa hàng loạt an toàn với Transaction
START TRANSACTION; SELECT * FROM DemoTable WHERE Subject != 'MongoDB'; -- Kiểm tra DELETE FROM DemoTable WHERE Subject != 'MongoDB'; -- Kiểm tra lại SELECT * FROM DemoTable; COMMIT; -- Hoặc ROLLBACK nếu sai
TRUNCATE vs DELETE
| Đặc điểm | DELETE | TRUNCATE |
|---|---|---|
| WHERE clause | Có | Không |
| Trigger | Kích hoạt | Không |
| Auto_increment | Giữ nguyên | Reset về 1 |
| Rollback | Có (trong transaction) | Không (DDL) |
| Tốc độ | Chậm (row by row) | Nhanh (deallocate pages) |
→ Dùng DELETE khi cần WHERE, TRUNCATE khi xóa toàn bộ bảng.