Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ลบข้อมูลหลายแถวใน MySQL ด้วย IN() ใน Query เดียว

ใช้ 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 ไม่จับคู่กับอะไรเลย (ปลอดภัย)
PerformanceIN() ใช้ 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() ด้วย