Oracle で複数レコードを一気に INSERT する記法を毎回忘れる

INSERT ALL の書き方を毎回忘れるのでメモ。

こう書く。

INSERT ALL
INTO tbl_hoge (id, name, age) VALUES (1, 'Michael', 55)
INTO tbl_hoge (id, name, age) VALUES (2, 'Christopher', 77)
INTO tbl_hoge (id, name, age) VALUES (3, 'Lea', 55)
INTO tbl_hoge (id, name, age) VALUES (4, 'Thomas', 57)
INTO tbl_hoge (id, name, age) VALUES (5, 'Claudia', 49)
SELECT * FROM DUAL;

INSERT ALL INTO だ。末尾の SELECT * FROM DUAL は必須。SELECT INSERT のテイと見せかけるためだ。

テーブル定義どおりに全カラムに値を入れるのであれば、カラム名の記述を省略して

INSERT ALL
INTO tbl_hoge VALUES (1, 'Michael', 55)
INTO tbl_hoge VALUES (2, 'Christopher', 77)
INTO tbl_hoge VALUES (3, 'Lea', 55)
INTO tbl_hoge VALUES (4, 'Thomas', 57)
INTO tbl_hoge VALUES (5, 'Claudia', 49)
SELECT * FROM DUAL;

と書ける。

INTO (table name) は省略したり1回にまとめたりはできない代わりに、以下のように1回のクエリで複数のテーブルに INSERT することもできる。

INSERT ALL
INTO tbl_hoge (id, name, age) VALUES (1, 'Michael', 55)
INTO tbl_movie (year, name) VALUES (1985, 'Back To The Future')
SELECT * FROM DUAL;

最近 Oracle ばっか触ってるけど、MySQL とかはこう書ける。

INSERT INTO tbl_hoge (id, name, age) VALUES
  (1, 'Michael', 55),
  (2, 'Christopher', 77),
  (3, 'Lea', 55),
  (4, 'Thomas', 57),
  (5, 'Claudia', 49);