負荷テスト等でDBに大量のテストデータが欲しい時が多々ある。
元になるimport用のDumpやCSVがあるなら良いが、今回は全くの0から作る場合を想定する。
今回は10万レコードのテストデータを作ることを考えてみる。
データの元になるテーブルを作成
まずはテーブルを作成。
mysql> create table testdata(str varchar(10)); Query OK, 0 rows affected (0.22 sec)
今回は文字数にばらつきを持たせるデータを作ることを想定してみる。
空文字を含む10個のアルファベットをINSERTする。
mysql> insert into testdata values('A'); Query OK, 1 row affected (0.03 sec) mysql> insert into testdata values('B'); Query OK, 1 row affected (0.00 sec) mysql> insert into testdata values('C'); Query OK, 1 row affected (0.00 sec) mysql> insert into testdata values('D'); Query OK, 1 row affected (0.01 sec) mysql> insert into testdata values('E'); Query OK, 1 row affected (0.00 sec) mysql> insert into testdata values('F'); Query OK, 1 row affected (0.00 sec) mysql> insert into testdata values('G'); Query OK, 1 row affected (0.00 sec) mysql> insert into testdata values('H'); Query OK, 1 row affected (0.00 sec) mysql> insert into testdata values('I'); Query OK, 1 row affected (0.00 sec) mysql> insert into testdata values(''); Query OK, 1 row affected (0.00 sec)
完成したテーブルは以下
mysql> select * from testdata; +------+ | str | +------+ | A | | B | | C | | D | | E | | F | | G | | H | | I | | | +------+ 10 rows in set (0.00 sec)
自己結合を利用して10万通りの組み合わせを作る
空文字を含む10個の文字が入っているので、5つテーブルを結合することで10^5のレコードが作れる。
mysql> select concat(t1.str, t2.str, t3.str, t4.str, t5.str) from testdata t1, testdata t2, testdata t3, testdata t4, testdata t5; +------------------------------------------------+ | concat(t1.str, t2.str, t3.str, t4.str, t5.str) | +------------------------------------------------+ | AAAAA | | BAAAA | | CAAAA | | DAAAA | | AAAA | | ⋮ | | F | | G | | H | | I | | | +------------------------------------------------+ 100000 rows in set (0.10 sec)
このクエリをsubqueryとして利用しINSERTを行えば、サクッと文字列のカラムを構築できる。
コメント