ใช้ DELETE หลายคำสั่ง หรือ Multi-table DELETE syntax เพื่อลบข้อมูลที่เกี่ยวข้องในหลายตาราง
สร้างตารางแรก
mysql> create table DemoTable1 (
Id int,
Name varchar(20) );
Query OK, 0 rows affected (0.63 sec)
เพิ่มข้อมูลตารางแรก
mysql> insert into DemoTable1 values(1,'Chris'); Query OK, 1 row affected (0.30 sec) mysql> insert into DemoTable1 values(2,'David'); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable1 values(3,'Bob'); Query OK, 1 row affected (0.20 sec)
สร้างตารางที่สอง
mysql> create table DemoTable2 (
ClientId int,
ClientName varchar(20) );
Query OK, 0 rows affected (1.19 sec)
เพิ่มข้อมูลตารางที่สอง
mysql> insert into DemoTable2 values(101,'Mike'); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable2 values(110,'Bob'); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable2 values(120,'Adam'); Query OK, 1 row affected (0.60 sec)
วิธีที่ 1: DELETE แยกตาราง (แนะนำสำหรับความชัดเจน)
mysql> delete from DemoTable1 where Name='Bob'; Query OK, 1 row affected (0.23 sec) mysql> delete from DemoTable2 where ClientName='Bob'; Query OK, 1 row affected (0.27 sec)
ตรวจสอบตารางแรก
mysql> select *from DemoTable1;
+------+-------+ | Id | Name | +------+-------+ | 1 | Chris | | 2 | David | +------+-------+ 2 rows in set (0.00 sec)
ตรวจสอบตารางที่สอง
mysql> select *from DemoTable2;
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 101 | Mike | | 120 | Adam | +----------+------------+ 2 rows in set (0.00 sec)
วิธีที่ 2: Multi-table DELETE (Single Statement)
DELETE t1, t2 FROM DemoTable1 t1 INNER JOIN DemoTable2 t2 ON t1.Name = t2.ClientName WHERE t1.Name = 'Bob';
ข้อดี/ข้อเสีย
| วิธี | ข้อดี | ข้อเสีย |
|---|---|---|
| แยกคำสั่ง | อ่านง่าย, Debug ง่าย, ควบคุม Transaction ได้ละเอียด | หลาย Round-trip, ต้องจัดการ Transaction เอง |
| Multi-table DELETE | Atomic, Single round-trip | Syntax ซับซ้อน, Debug ยาก, ไม่รองรับ LIMIT/ORDER BY |
แนวทางปฏิบัติที่ดี
- ใช้ Foreign Key กับ
ON DELETE CASCADEสำหรับความสัมพันธ์ Parent-Child - ห้ามใช้ Multi-table DELETE กับ InnoDB ที่มี Foreign Key (จะ Error)
- ทดสอบด้วย SELECT JOIN ก่อน DELETE จริง