PostgreSQL小ネタ(一発INSERT)

PostgreSQL database

昨日の記事を公開した後で思い出したtipsです。同一テーブルへ連続してINSERTを行うことがあります。下記は昨日の記事の例です。

-- テストデータ投入
INSERT INTO testtable VALUES(1, '2020-01-01', 'りんご', 1000);
INSERT INTO testtable VALUES(2, '2020-01-01', 'りんご', 2000);
INSERT INTO testtable VALUES(3, '2020-01-01', 'バナナ', 3000);
INSERT INTO testtable VALUES(4, '2020-02-02', 'りんご', 1000);
INSERT INTO testtable VALUES(5, '2020-03-03', 'りんご', 5000);
INSERT INTO testtable VALUES(6, '2020-03-03', 'みかん', 1000);
INSERT INTO testtable VALUES(7, '2020-03-03', 'バナナ', 3000);
INSERT INTO testtable VALUES(8, '2020-04-03', 'いちご', 4000);
INSERT INTO testtable VALUES(9, '2020-04-04', 'りんご', 1000);
INSERT INTO testtable VALUES(10,'2020-04-01', 'バナナ', 1000);

この実行結果がこちらです。

sandambara=> -- テストデータ投入
sandambara=> INSERT INTO testtable VALUES(1, '2020-01-01', 'りんご', 1000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(2, '2020-01-01', 'みかん', 2000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(3, '2020-01-01', 'バナナ', 3000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(4, '2020-02-02', 'りんご', 1000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(5, '2020-03-03', 'りんご', 5000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(6, '2020-03-03', 'みかん', 1000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(7, '2020-03-03', 'バナナ', 3000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(8, '2020-04-03', 'いちご', 4000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(9, '2020-04-04', 'りんご', 1000);
INSERT 0 1
sandambara=> INSERT INTO testtable VALUES(10,'2020-04-01', 'バナナ', 1000);
INSERT 0 1

普通ですね(笑)

「ちゃんとトランザクションかけろ」という意見はあるかもしれませんが、だからと言ってこのSQLが悪い訳ではありません。でも、もっとスマートな方法があります。こちらのSQLをご覧ください。

-- 上記はこのように書ける
INSERT INTO testtable VALUES
(1, '2020-01-01', 'りんご', 1000),
(2, '2020-01-01', 'りんご', 2000),
(3, '2020-01-01', 'バナナ', 3000),
(4, '2020-02-02', 'りんご', 1000),
(5, '2020-03-03', 'りんご', 5000),
(6, '2020-03-03', 'みかん', 1000),
(7, '2020-03-03', 'バナナ', 3000),
(8, '2020-04-03', 'いちご', 4000),
(9, '2020-04-04', 'りんご', 1000),
(10,'2020-04-01', 'バナナ', 1000);

実行結果はこちらです。

sandambara=> INSERT INTO testtable VALUES
sandambara-> (1, '2020-01-01', 'りんご', 1000),
sandambara-> (2, '2020-01-01', 'りんご', 2000),
sandambara-> (3, '2020-01-01', 'バナナ', 3000),
sandambara-> (4, '2020-02-02', 'りんご', 1000),
sandambara-> (5, '2020-03-03', 'りんご', 5000),
sandambara-> (6, '2020-03-03', 'みかん', 1000),
sandambara-> (7, '2020-03-03', 'バナナ', 3000),
sandambara-> (8, '2020-04-03', 'いちご', 4000),
sandambara-> (9, '2020-04-04', 'りんご', 1000),
sandambara-> (10,'2020-04-01', 'バナナ', 1000);
INSERT 0 10

1つのSQLで実行できました。「ちりも積もれば」ではありませんが、こういう細かなテクニックは後々効いてきますのでぜひマスターしておきましょう!

コメント