周りで SQL の速度改善の話が紛糾していて、INSERT ALL を使ってみたら逆に速度が低下した!なんでや!?
というようなやり取りが起きていたのを聞き、INSERT ALL がどういうものかよくわからなかったのもあって気になり調べてみました。
速度は別の手段で解決したらしいけど (後日調査予定)。
INSERT ALL とは、Oracle で使えるマルチテーブルインサートと呼ばれるもの。
他の DB で同様の書き方という形で一緒に紹介されているのはマルチレコードインサート (そんな言葉はなさそう) と言ったほうが正しいもので、標準の書き方で複数のテーブルに一括でインサートできるのは Oracle のみの様子? (MySql は何やら複雑なことをしないとダメらしい)
構文としては
INSERT ALL
INTO TABLE1 (col1, col2) VALUES ('var1', 'var2')
INTO TABLE2 (colA, colB) VALUES ('varA', 'varB')
SELECT文
が基本形の模様。SELECT文は、利用しない場合でも省略不能で
SELECT * FROM DUAL;
が定番のようでそこかしこに書かれています。
SELECT文は、検索結果をそれぞれの VALUES 句の中で使えます。
構文としては
INSERT ALL
INTO TABLE1 (col1, col2) VALUES ('var1', res)
INTO TABLE2 (colA, colB) VALUES ('varA', res)
SELECT res from TABLE3 WHERE ID = 1;
というような書き方。
SELECT文で複数の結果が得られる場合でも使えるのかは不明。ためしに一例やってみたところ、インサートされる側のテーブルの一意制約違反のエラーが出ました。
うまく使えると芸術点が高そう・・・。