- 開発技術
MySQLのストアドプロシージャを用いたデータ作成
- MySQL
この記事を書いたチーム:frontier
はじめに
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
ストアドプロシージャは、データベースに対する複数のSQL文を1つのプログラムにまとめたもので、大量のテストデータを作成したい場合などに便利です。この記事では、MySQLのストアドプロシージャを用いたデータ作成の方法について紹介します。
実行環境
MySQL 8.0.33 Command Line Client
作成するデータ
以下のようなデータを作成したいと思います。
ストアドプロシージャの作成
ストアドプロシージャを作成する際の基本的な構文は次の通りです。
1 2 3 4 |
CREATE PROCEDURE [ストアドプロシージャ名]() BEGIN [一連の処理] END; |
※注意点:ストアドプロシージャ作成の前後でデリミタを変更する必要があります。MySQLでは「;」で実行されてしまうため、そのまま実行するとストアドプロシージャ内の最初の「;」で実行されてしまいエラーとなります。
そのため、ストアドプロシージャ作成前にデリミタを「//」に変更し、作成後は「;」に戻します。(詳細はソースコードを参照)
ソースコード
全体のソースコードは次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
-- データベース「test_db」を作成 CREATE DATABASE test_db; -- データベース「test_db」を使用する USE test_db; -- テーブル「user」を作成 CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT, user_name varchar(20) NOT NULL, age int(3) NOT NULL, registration_date date NOT NULL, PRIMARY KEY (id) ) DEFAULT CHARSET=utf8; -- デリミタを「//」に変更 DELIMITER // -- ここからストアドプロシージャ「proc_test」の登録 CREATE PROCEDURE proc_test() BEGIN -- ループ回数の上限 DECLARE loopLimit int DEFAULT 100; -- ループ回数 DECLARE count bigint DEFAULT 0; DECLARE user_name varchar(20); DECLARE age int(3); DECLARE registration_date date DEFAULT '2023-04-01'; WHILE count < loopLimit DO -- 「user_name」はuser1, user2, ...となるようにする SET user_name = CONCAT('user', (count + 1)); -- 「age」には1~100の乱数を設定する SET age = CEIL(RAND() * 100); -- データを追加 INSERT INTO user(user_name, age, registration_date) VALUES (user_name, age, registration_date); -- 「registration_date」に1日足す SET registration_date = registration_date + INTERVAL 1 DAY; -- ループ回数を数える SET count = count + 1; END WHILE; END; // -- ここまでストアドプロシージャ「proc_test」の登録 -- デリミタを「;」に変更 DELIMITER ; -- ストアドプロシージャ「proc_test」を呼び出す CALL proc_test(); -- ストアドプロシージャ「proc_test」を削除 DROP PROCEDURE proc_test; |
次のコマンドで実行することができます。
1 |
source [sqlファイルのパス] |
終わりに
MySQLのストアドプロシージャを用いたデータ作成の方法について紹介しました。ストアドプロシージャは特にループ処理の必要なデータ作成に有効なので、ぜひ使ってみてください。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>