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

Làm thế nào để INSERT vào hai bảng bằng một truy vấn MySQL?

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ểmNhược điểm
Stored ProcedureTái sử dụng, atomic, logic tập trungCần quyền CREATE ROUTINE
TriggerTự động, không đổi app codeKhó debug, ẩn logic
TransactionĐơn giản, kiểm soát từ app2 round-trip, app phải quản lý