Có. Stored Procedure cho phép gom nhiều câu lệnh INSERT vào một đơn vị thực thi, gọi bằng một lệnh CALL.
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 | +----------+------------+-----------+
Ưu điểm Stored Procedure
- Atomicity: Bọc trong transaction (START TRANSACTION ... COMMIT/ROLLBACK)
- Tái sử dụng: Gọi nhiều lần từ app với tham số khác nhau
- Bảo mật: App chỉ cần quyền EXECUTE, không cần INSERT trực tiếp
- Hiệu năng: Giảm network round-trip, parse/optimize một lần
Transaction trong 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
Phương án thay thế
- Trigger: Tự động INSERT bảng 2 khi INSERT bảng 1
- Multi-table INSERT: Không hỗ trợ trực tiếp trong MySQL (khác Oracle)
- Application-level transaction: App quản lý BEGIN/COMMIT