DELETE ทุกแถวยกเว้นที่ระบุ (Keep Specific Rows)
ใช้ DELETE ... WHERE column NOT IN (values_to_keep)
ไวยากรณ์
DELETE FROM yourTable WHERE yourColumn NOT IN ('keep1', 'keep2', 'keep3');
ตัวอย่าง
CREATE TABLE deleteAllRowsWithCondition (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(20)
);
INSERT INTO deleteAllRowsWithCondition(Name) VALUES
('Larry'), ('John'), ('Sam'), ('Mike'), ('Carol'), ('Bob'), ('David');
ก่อน Delete
+----+-------+ | Id | Name | +----+-------+ | 1 | Larry | | 2 | John | | 3 | Sam | | 4 | Mike | | 5 | Carol | | 6 | Bob | | 7 | David | +----+-------+
ลบยกเว้น John, Mike, Carol
DELETE FROM deleteAllRowsWithCondition
WHERE Name NOT IN ('John', 'Mike', 'Carol');
หลัง Delete
+----+-------+ | Id | Name | +----+-------+ | 2 | John | | 4 | Mike | | 5 | Carol | +----+-------+
ข้อควรระวัง
- NOT IN กับ NULL: ถ้า Subquery คืน NULL → ผลลัพธ์ว่างทั้งหมด (ใช้ NOT EXISTS แทน)
- Backup ก่อน Delete จำนวนมาก
- ใช้ Transaction:
START TRANSACTION; DELETE ...; COMMIT; - Foreign Key: ต้องลบ Child Table ก่อน หรือ ON DELETE CASCADE
ทางเลือก: NOT EXISTS
DELETE FROM table_A WHERE NOT EXISTS (SELECT 1 FROM table_B WHERE table_B.id = table_A.id);
ปลอดภัยกว่า NOT IN เมื่อมี NULL