18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

INSERT ALL 複数のテーブルに複数のレコードを一気に登録 Oracle

Last updated at Posted at 2017-03-02

周りで 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文で複数の結果が得られる場合でも使えるのかは不明。ためしに一例やってみたところ、インサートされる側のテーブルの一意制約違反のエラーが出ました。

うまく使えると芸術点が高そう・・・。

18
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?