ไวยากรณ์ DELETE ด้วย IN
ใช้ IN (value1, value2, ...) เพื่อลบหลายแถวในคำสั่งเดียว:
DELETE FROM your_table
WHERE id_column IN (value1, value2, value3, ...);
ตัวอย่างการใช้งาน
สร้างตารางและข้อมูล 6 แถว
CREATE TABLE DeleteManyRows (Id INT, Name VARCHAR(200), Age INT);
INSERT INTO DeleteManyRows VALUES
(1, 'John', 23), (2, 'Johnson', 22), (3, 'Sam', 20),
(4, 'David', 26), (5, 'Carol', 21), (6, 'Smith', 29);
ข้อมูลก่อนลบ
+------+---------+------+
| Id | Name | Age |
+------+---------+------+
| 1 | John | 23 |
| 2 | Johnson | 22 |
| 3 | Sam | 20 |
| 4 | David | 26 |
| 5 | Carol | 21 |
| 6 | Smith | 29 |
+------+---------+------+
ลบ ID 1,2,3,4 พร้อมกัน
DELETE FROM DeleteManyRows WHERE Id IN (1, 2, 3, 4);
ผลลัพธ์เหลือ ID 5,6
+------+-------+------+
| Id | Name | Age |
+------+-------+------+
| 5 | Carol | 21 |
| 6 | Smith | 29 |
+------+-------+------+
เคล็ดลับและ Best Practices
ใช้ Subquery แทนรายการค่า (Dynamic)
DELETE FROM orders
WHERE customer_id IN (SELECT id FROM customers WHERE status = 'inactive');
จำนวนค่าใน IN Clause
- MySQL ไม่มีข้อจำกัดจำนวนค่าใน IN() โดยตรง
- แต่มีข้อจำกัด
max_allowed_packet(ค่าเริ่มต้น 4MB/64MB) - หากมี ID มากกว่า 1000+ ควรใช้ JOIN หรือ Temporary Table
ใช้ JOIN สำหรับการลบขนาดใหญ่
DELETE d FROM DeleteManyRows d
JOIN (SELECT 1 AS id UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) ids
ON d.Id = ids.id;
ตรวจสอบก่อนลบ (Safe Preview)
SELECT * FROM DeleteManyRows WHERE Id IN (1, 2, 3, 4);
-- ตรวจสอบข้อมูลก่อน แล้วค่อยรัน DELETE
หมายเหตุ: DELETE จะยิง ON DELETE TRIGGER และสามารถ Rollback ได้ (ใน Transaction) ต่างจาก TRUNCATE