MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのストアドプロシージャで1回の呼び出しにより2つのテーブルへ同時にレコードを挿入する方法

ストアドプロシージャを使えば複数テーブルへの同時挿入は可能

結論から言うと、はい、可能です。MySQLのストアドプロシージャを利用すれば、1回の呼び出しで複数のINSERT文を実行し、2つ以上のテーブルにまとめてレコードを挿入できます。

ここでは、実際に動作を確認できるサンプルコードとともに、手順を順番に解説します。

手順1:1つ目のテーブルを作成する

まず、学生情報を格納するテーブル「DemoTable」を作成します。

mysql> create table DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName varchar(20)
);
Query OK, 0 rows affected (0.56 sec)

StudentIdにはAUTO_INCREMENTを設定しているため、レコードを挿入すると自動的に連番が採番されます。

手順2:2つ目のテーブルを作成する

次に、クライアント情報を格納するテーブル「DemoTable2」を作成します。

mysql> create table DemoTable2
(
    ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ClientName varchar(20),
    ClientAge int
);
Query OK, 0 rows affected (0.76 sec)

手順3:ストアドプロシージャを作成する

続いて、両方のテーブルにINSERTを実行するストアドプロシージャ「insert_into_twoTables」を作成します。

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
    //
Query OK, 0 rows affected (0.14 sec)
mysql> DELIMITER ;

ポイント:ストアドプロシージャ内ではセミコロン(;)が文中に含まれるため、事前にDELIMITER //で区切り文字を変更し、定義完了後にDELIMITER ;で元に戻すのが一般的です。この処理を忘れると構文エラーになるので注意しましょう。

手順4:CALLコマンドでプロシージャを実行する

作成したストアドプロシージャは、CALLコマンドで呼び出します。引数として名前「Tom」と年齢「38」を渡してみます。

mysql> call insert_into_twoTables('Tom', 38);
Query OK, 1 row affected, 1 warning (0.41 sec)

これで、1回の呼び出しで2つのテーブルへの挿入が実行されました。

手順5:挿入結果を確認する

まず、1つ目のテーブル「DemoTable」の全レコードを表示します。

mysql> select * from DemoTable;

実行結果は以下の通りです。

+-----------+------------------+
| StudentId | StudentFirstName |
+-----------+------------------+
| 1         | Tom              |
+-----------+------------------+
1 row in set (0.00 sec)

続いて、2つ目のテーブル「DemoTable2」も確認します。

mysql> select * from DemoTable2;

実行結果は以下の通りです。

+----------+------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+------------+-----------+
| 1        | Tom        | 38        |
+----------+------------+-----------+
1 row in set (0.00 sec)

補足:データ整合性を保ちたい場合の注意点

上記のように2つのINSERT文を連続実行する場合、片方だけ成功してもう片方が失敗するケースも考慮が必要です。重要なデータを扱う場合は、プロシージャ内でSTART TRANSACTION(トランザクション)を使用し、両方のINSERTが成功したときのみCOMMIT、失敗した場合はROLLBACKで元に戻す設計にしておくと、データの整合性を確実に守れます。

  1. MySQLで複数のレコードをすばやく一括挿入するクエリの書き方

    MySQLで複数のレコードを効率よく挿入したい場合、INSERT文を何度も実行するのではなく、1つのINSERT文で複数行をまとめて指定するのがおすすめです。この方法ならデータベースとの通信回数が減り、処理速度が大幅に向上します。 基本構文 複数のレコードをすばやく挿入するには、単一のINSERT文を使い、以下の構文に従います。 insert into yourTableName values(yourValue1,yourValue2,...N),(yourValue1,yourValue2,...N).....N; ポイントは、各行の値セットをカンマ(,)で区切って並べるだけというシンプル

  2. MySQLストアドプロシージャでDELIMITER(区切り文字)を正しく使って値を挿入する方法

    MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の扱いに戸惑う方は少なくありません。デフォルトではMySQLクライアントがセミコロン「;」を文の終端として解釈するため、プロシージャ内の複数のSQL文が途中で分割されてしまうことがあります。本記事では、区切り文字を正しく変更しながら、ストアドプロシージャを使ってテーブルへ値を挿入する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、データを挿入するためのテーブルを作成します。ここでは学生の名前と姓を格納するテーブルを用意しました。 mysql> create table DemoTable