MySQL không hỗ trợ INSERT vào nhiều bảng trong một câu lệnh đơn. Giải pháp phổ biến là dùng Stored Procedure để gom nhiều INSERT thành một lần gọi.
Tạo 2 bảng
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
-> );
Tạo 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 ;
Gọi Procedure
mysql> CALL insert_into_twoTables('Tom', 38);
Query OK, 1 row affected, 1 warning (0.41 sec)
Kiểm tra cả 2 bảng
mysql> SELECT * FROM DemoTable;
+-----------+------------------+ | StudentId | StudentFirstName | +-----------+------------------+ | 1 | Tom | +-----------+------------------+
mysql> SELECT * FROM DemoTable2;
+----------+------------+-----------+ | ClientId | ClientName | ClientAge | +----------+------------+-----------+ | 1 | Tom | 38 | +----------+------------+-----------+
Các phương án thay thế
1. Trigger (tự động)
CREATE TRIGGER after_demo_insert AFTER INSERT ON DemoTable FOR EACH ROW INSERT INTO DemoTable2(ClientName, ClientAge) VALUES(NEW.StudentFirstName, 0);
2. Transaction (application level)
START TRANSACTION;
INSERT INTO DemoTable(StudentFirstName) VALUES('Tom');
INSERT INTO DemoTable2(ClientName, ClientAge) VALUES('Tom', 38);
COMMIT;
3. INSERT ... SELECT từ bảng tạm
CREATE TEMPORARY TABLE tmp (name VARCHAR(20), age INT);
INSERT INTO tmp VALUES('Tom', 38);
INSERT INTO DemoTable(StudentFirstName) SELECT name FROM tmp;
INSERT INTO DemoTable2(ClientName, ClientAge) SELECT name, age FROM tmp;
So sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| Stored Procedure | Tái sử dụng, atomic, logic tập trung | Cần quyền CREATE ROUTINE |
| Trigger | Tự động, không đổi app code | Khó debug, ẩn logic |
| Transaction | Đơn giản, kiểm soát từ app | 2 round-trip, app phải quản lý |