これまでテスト用にたくさんデータを作成する時は、
PythonやらNode.jsやらでプログラムを書いてた。
blog.honjala.net
PostgreSQLならgenerate_seriesという連続値生成関数を利用することで
SQLだけで手軽にデータ生成できる、ということを発見したので、
今回は上記の記事と同じようなテストデータをSQLで作成してみる。
環境はPostgreSQL 9.5。
下記のようなテーブルを作成する。
drop table if exists bulk_test_items;
create table bulk_test_items(
id serial not null,
item_cd varchar(100),
name varchar(100),
created timestamp default current_timestamp,
primary key(id)
);
そして、generate_seriesとinsert-selectを組み合わせたデータ生成SQLを作成する。
insert into bulk_test_items(item_cd, name, created)
select
to_char(i, 'FM0000000000'),
format('テスト商品%s', i),
clock_timestamp()
from
generate_series(1, 10) as i
;
これで下記のようなデータが生成される:
id | item_cd | name | created
----+-------------+--------------+----------------------------
1 | 0000000001 | テスト商品1 | 2016-11-02 00:42:30.138823
2 | 0000000002 | テスト商品2 | 2016-11-02 00:42:30.147692
3 | 0000000003 | テスト商品3 | 2016-11-02 00:42:30.14774
4 | 0000000004 | テスト商品4 | 2016-11-02 00:42:30.147766
5 | 0000000005 | テスト商品5 | 2016-11-02 00:42:30.147788
6 | 0000000006 | テスト商品6 | 2016-11-02 00:42:30.14781
7 | 0000000007 | テスト商品7 | 2016-11-02 00:42:30.147832
8 | 0000000008 | テスト商品8 | 2016-11-02 00:42:30.147855
9 | 0000000009 | テスト商品9 | 2016-11-02 00:42:30.147878
10 | 0000000010 | テスト商品10 | 2016-11-02 00:42:30.147901
(10 行)
なんて簡単なんでしょう。
generate_seriesに渡すパラメータを変更すれば数万件のデータも作成できる。
9.24. 集合を返す関数
おわり
いいもの発見した、と思ってたら
既にもっと色々なパターンを紹介してくれている解説記事が公開されていた。
lets.postgresql.jp