Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Có thể dùng Stored Procedure để INSERT vào 2 bảng cùng lúc trong MySQL?

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