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

การลบข้อมูลหลายตารางพร้อมกัน (Multi-table DELETE) ใน MySQL

ใช้ 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 DELETEAtomic, Single round-tripSyntax ซับซ้อน, Debug ยาก, ไม่รองรับ LIMIT/ORDER BY

แนวทางปฏิบัติที่ดี

  • ใช้ Foreign Key กับ ON DELETE CASCADE สำหรับความสัมพันธ์ Parent-Child
  • ห้ามใช้ Multi-table DELETE กับ InnoDB ที่มี Foreign Key (จะ Error)
  • ทดสอบด้วย SELECT JOIN ก่อน DELETE จริง