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

INSERT ข้อมูลเข้า 2 ตารางพร้อมกันใน MySQL ด้วย Stored Procedure

MySQL ไม่รองรับ INSERT หลายตารางในคำสั่งเดียวโดยตรง แต่สามารถทำได้ผ่าน Stored Procedure ที่ห่อหุ้มหลายคำสั่ง INSERT ไว้ภายใน

สร้างตาราง 2 ตาราง

mysql> create table DemoTable (
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName varchar(20)
);
mysql> create table DemoTable2 (
    ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ClientName varchar(20),
    ClientAge int
);

สร้าง Stored Procedure

mysql> DELIMITER //
mysql> CREATE PROCEDURE insert_into_twoTables(name varchar(100), age int)
BEGIN
    INSERT INTO DemoTable(StudentFirstName) VALUES(name);
    INSERT INTO DemoTable2(ClientName, ClientAge) VALUES(name, age);
END //
mysql> DELIMITER ;

เรียกใช้ Procedure

mysql> call insert_into_twoTables('Tom', 38);

ตรวจสอบข้อมูลทั้ง 2 ตาราง

mysql> select * from DemoTable;
+-----------+------------------+
| StudentId | StudentFirstName |
+-----------+------------------+
| 1         | Tom              |
+-----------+------------------+
mysql> select * from DemoTable2;
+----------+------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+------------+-----------+
| 1        | Tom        | 38        |
+----------+------------+-----------+

ข้อดีของ Stored Procedure

  • Atomicity - ใช้ Transaction ได้ (START TRANSACTION ... COMMIT/ROLLBACK)
  • Reusable - เรียกจาก Application หลายจุด
  • Security - ให้สิทธิ์ EXECUTE Procedure แทน INSERT ตรงตาราง
  • Logic ซับซ้อน - ตรวจสอบเงื่อนไข, Loop, Cursor ได้

เพิ่ม Transaction ใน Procedure

CREATE PROCEDURE insert_into_twoTables(name varchar(100), age int)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        RESIGNAL;
    END;
    
    START TRANSACTION;
    INSERT INTO DemoTable(StudentFirstName) VALUES(name);
    INSERT INTO DemoTable2(ClientName, ClientAge) VALUES(name, age);
    COMMIT;
END

ทางเลือกอื่น

  • Trigger - AFTER INSERT บนตารางแรก → INSERT ตารางที่สอง (แต่ Debug ยาก)
  • Application Layer - จัดการใน Code (PHP, Python, Node.js) ใช้ Transaction
  • Multi-table INSERT - ไม่รองรับใน MySQL (รองรับใน Oracle/PostgreSQL)

คำเตือน

  • DELIMITER ต้องเปลี่ยนก่อน CREATE PROCEDURE
  • ชื่อ Procedure ต้องไม่ซ้ำ Keyword
  • MySQL 8.0+ รองรับ CTE ใน Procedure ได้