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 ได้