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

ลบแถวใน MySQL โดยเก็บเฉพาะรายการที่ระบุด้วย NOT IN

เมื่อต้องการลบข้อมูลทั้งหมดยกเว้นรายการที่ระบุ (Whitelist) ให้ใช้ DELETE ... WHERE column NOT IN (...)

ตัวอย่างการสร้างตาราง

mysql> create table DemoTable ( 
    FirstName varchar(100) ); 
Query OK, 0 rows affected (0.65 sec)

เพิ่มข้อมูล 5 ชื่อ

mysql> insert into DemoTable values('Chris'); 
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('Robert'); 
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Mike'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Sam'); 
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('David'); 
Query OK, 1 row affected (0.12 sec)

แสดงข้อมูลก่อนลบ

mysql> select * from DemoTable;
+-----------+
| FirstName |
+-----------+
| Chris     |
| Robert    |
| Mike      |
| Sam       |
| David     |
+-----------+
5 rows in set (0.00 sec)

คำสั่ง DELETE ลบทุกอย่างยกเว้น Robert และ Mike

mysql> delete from DemoTable where FirstName NOT IN('Robert', 'Mike'); 
Query OK, 3 rows affected (0.17 sec)

ตรวจสอบข้อมูลหลังลบ (เหลือแค่ Robert และ Mike)

mysql> select * from DemoTable;
+-----------+
| FirstName |
+-----------+
| Robert    |
| Mike      |
+-----------+
2 rows in set (0.00 sec)

คำอธิบาย: NOT IN ('Robert', 'Mike') หมายถึง "ไม่ใช่ Robert และไม่ใช่ Mike" ทำให้แถวที่มีชื่ออื่นถูกลบออก วิธีนี้เหมาะสำหรับการเก็บข้อมูลเฉพาะรายการที่ต้องการ (Whitelist approach)

ข้อควรระวัง: หากคอลัมน์มีค่า NULL ค่า NULL จะไม่เข้าสู่ NOT IN ได้ (เพราะ NULL ไม่เท่ากับอะไรเลย) ต้องเพิ่ม OR column IS NULL หากต้องการเก็บ NULL ไว้