ใช้ DELETE ... WHERE column IN (value1, value2, ...) เพื่อลบหลายแถวพร้อมกันใน Statement เดียว
Syntax
DELETE FROM table_name WHERE id_column IN (val1, val2, val3, ...);
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
mysql> create table DemoTable1922 (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20)
-> ); Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1922(StudentName) values('Chris'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1922(StudentName) values('Robert'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1922(StudentName) values('David'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1922(StudentName) values('Mike'); Query OK, 1 row affected (0.00 sec)
ข้อมูลทั้งหมด:
mysql> select * from DemoTable1922;
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Chris | | 2 | Robert | | 3 | David | | 4 | Mike | +-----------+-------------+ 4 rows in set (0.00 sec)
2. ลบแถว Id 1,2,3,4 ทั้งหมดด้วย IN()
mysql> delete from DemoTable1922 where StudentId IN (1,2,3,4); Query OK, 4 rows affected (0.00 sec)
3. ตรวจสอบ: ตารางว่าง
mysql> select * from DemoTable1922;
Empty set (0.00 sec)
การใช้ IN() กับ Subquery
-- ลบนักเรียนที่ไม่มีคะแนน DELETE FROM students WHERE student_id IN (SELECT student_id FROM grades WHERE score IS NULL);
⚠️ ข้อจำกัดและ Best Practice
| หัวข้อ | รายละเอียด |
|---|---|
| จำนวนค่าใน IN() | MySQL ไม่จำกัดแต่อาจช้า ถ้ามากกว่า 1000 ค่า แนะนำ用 JOIN หรือ Temp Table |
| NULL ใน IN() | WHERE col IN (1,2,NULL) → NULL ไม่จับคู่กับอะไรเลย (ปลอดภัย) |
| Performance | IN() ใช้ Index ได้ (Range Scan) เร็วกว่า OR หลายตัว |
| Transaction | ควร wrap ใน Transaction สำหรับการลบจำนวนมาก |
DELETE แบบมีเงื่อนไขซับซ้อน
DELETE t1 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.ref_id WHERE t2.status = 'deleted';
สรุป: ใช้ DELETE FROM table WHERE id IN (1,2,3...) ลบหลายแถว Query เดียว เร็วกว่า DELETE หลายครั้ง รองรับ Subquery ใน IN() ด้วย