SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

さくっと100万件レベルのデータのテストデータを作成する方法

問題

大量のテスト用データのあるテスト環境を作りたいんだけど、大量のデータを作るのって大変ですか?

database

答え

100万件レベルのデータのテストデータをさくっと作成する方法。

MySQLの場合。

primary key が AUTO_INCREMENT なら

# テーブル作る
create table a (id int primary key auto_increment, xxx varchar(10));
# 1レコード作る
insert into a () values ();
# 倍々する
insert into a (id) select 0 from a; -- 2行になる
insert into a (id) select 0 from a; -- 4行になる
insert into a (id) select 0 from a; -- 8行になる
insert into a (id) select 0 from a; -- 16行になる
-- 20回繰り返したら 100万件!
# 100万レコード作ったら、update文でそれらしい内容に変えていく
update a set xxx = concat('会員', id); -- xxx を 会員1、会員2、会員3… にする 

プライマリキーが連番ではない場合

# 空のテーブル作る
create table 注文テーブル (~~テーブル定義~~);

# 1行データ入れる
insert into 注文テーブル(注文番号) values (0);

# 2行にする
insert into 注文テーブル (注文番号) select 注文番号 + 1 from 注文テーブル;
# 4行にする
insert into 注文テーブル (注文番号) select 注文番号 + 2 from 注文テーブル;
# 8行にする
insert into 注文テーブル (注文番号) select 注文番号 + 4 from 注文テーブル;
# 以下続く(AUTO_INCREMENTでないと面倒)
insert into 注文テーブル (注文番号) select 注文番号 + 8 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 16 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 32 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 64 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 128 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 256 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 512 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 1024 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 2048 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 4096 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 8192 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 16384 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 32768 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 65536 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 131072 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 262144 from 注文テーブル;
insert into 注文テーブル (注文番号) select 注文番号 + 524288 from 注文テーブル;

# レコードは100万件になったので、あとはupdate文でそれらしいデータにしていく
update 注文テーブル set 会員番号 = concat('ABC', 注文番号);
update 注文テーブル set 会員氏名 = concat('会員', 注文番号);
update 注文テーブル set 電話番号 = ceil(rand() * 10000000000);

関連するメモ

コメント(2)

774 2019年3月24日 17:34

seletになってました!

yoshimura 2019年3月28日 12:14

ご指摘ありがとうございます。 修正しました!