Oracle Database(以下Oracle DB)は世界でもトップクラスのシェアを誇るDBです。
今回は、Oracle DBでのINSERT ALLやINSERT FIRSTについてご紹介します。
INSERT文ではまとめて実行することが可能です。
その方法について見ていきましょう!
記事の信頼性:未経験からIT企業の受託企業へ転職に成功。現役プログラマーの「しう」がOracle DBのINSERT ALL INSERT FIRST について書いています。
マルチテーブルINSERT

マルチテーブルINSERTを使うと複数の表へ、まとめて行を追加することができます!
わざわざ、同じINSERT文を何度も書くのは不便ですよね。
そんな時に役立つSQL文になります。

副問い合わせが戻す複数の行を、まとめて複数の表に追加できるから便利やねん!
マルチテーブルINSERTの構文
マルチテーブルINSERTを使うと複数の表へ、まとめて行を追加することができます!
INSERT ALL
INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
SELECT ・・・
また、条件をつけたい場合のマルチテーブルINSERTの構文は次のようになります。
INSERT [ ALL | FIRST ]
WHEN <条件>
THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
[WHEN <条件>
THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)] ]
・・・
[ELSE INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]]
SELECT ・・・
(本来改行は必要ありませんが、見にくかったので入れています。)
条件つきの場合は、INSERT ALLとINSERT FIRSTの2種類があります。
その違いについてもこの後見ていきます!



なんか構文が長すぎてわからないよぉ



最初はややこしく感じるやんな~



慣れてきたら使い方もわかるから一緒に見ていこか!
無条件INSERT
無条件INSERTでは、INTOで指定したすべてのテーブルにINSERTされます!
INSERT ALL
INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
SELECT ・・・
具体的には、次のようにするとまとめてINSERTをおこなうことができます。
初めにt0テーブル、s1、s2テーブルの構造を確認します。


t0テーブルの1,2列目がs1テーブルと、t0テーブルの1,3列目がs2テーブルと同じ形になっています。
t0テーブルのデータを確認すると次のようになります。


ここでマルチテーブルINSERTを利用して、s1、s2テーブルにまとめて行の追加を行います!
利用するコードは
INSERT ALL
--どのテーブルのどの行に追加するか
INTO s1 VALUES(n, s1)
INTO s2 VALUES(n, s2)
--どのテーブルのどの列から追加するか
SELECT n, s1, s2 FROM t0;
です。
この無条件INSERT文を利用することで
S1テーブルには


S2テーブルには


のようにデータが入ります。
列数が異なる場合も列を指定することで、別々のテーブルに代入できることが確認できましたね!
条件付きINSERT FIRST
条件付きINSERT FIRSTでは、INTOで指定したテーブルに条件に当てはまる最初のWHEN句に行がINSERTされます!
INSERT FIRST
WHEN <条件1>
THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
・・・
ELSE INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
SELECT ・・・
(ここも改行は必要ないですが、見やすさのために入れています。)
具体的には、次のようにするとまとめてINSERT FIRSTをおこなうことができます。
利用するテーブルは先ほどと同じ、t0、s1、s2テーブルに加えて、s1、s2テーブルと同じ構造のs3、s4テーブルとします。


ここで、INSERT FIRSTを利用してまとめて行の追加をおこないます。
利用するコードは
INSERT FIRST
--① 初めにここの条件をチェック
WHEN n<= 1 THEN
INTO s1 VALUES(n, s1)
INTO s2 VALUES(n, s2)
--② ①の条件に当てはまらなければ、②の条件をチェック
WHEN n<= 2 THEN
INTO s3 VALUES(n, s1)
INTO s4 VALUES(n, s2)
-- 追加する行を選択
SELECT n, s1, s2 FROM t0;
になります。
s1~s4までのテーブルを確認すると、次のようになります。




初めにWHEN n <= 1のチェックをして、当てはまらなかった場合n <= 2のチェックに移っているのが確認できます。
n=1 の条件は、2つ目のWHENの n<=2 にも当てはまっていますが、n<=1 の条件を先に満たすので n<=2 の時には無視している点に注意してください。
条件付きINSERT ALL
条件付きINSERT ALLでは、INTOで指定したテーブルに条件に当てはまるWHEN句に行がINSERTされます!
INSERT ALL
WHEN <条件1>
THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
・・・
ELSE INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
SELECT ・・・
(ここも改行は必要ないですが、見やすさのために入れています。)
先ほどのINSERT FIRSTと異なる部分は、2番目以降のWHEN句の条件に当てはまれば、1番目のWHEN句で当てはまっていても行の追加が行われることです。
具体的には、次のようになります。
INSERT ALL
--①初めにここの条件をチェック
WHEN n<= 1 THEN
INTO s1 VALUES(n, s1)
INTO s2 VALUES(n, s2)
--② ①の条件に関係なく、②の条件をチェック
WHEN n<= 2 THEN
INTO s3 VALUES(n, s1)
INTO s4 VALUES(n, s2)
SELECT n, s1, s2 FROM t0;
s1~s4までのテーブルを確認すると次のようになります。




先ほどの、INSERT FIRSTと違う点はs3、s4のテーブルです。
INSERT FIRSTの場合、n = 1の s1 = ‘A’、s2 = ‘あ’ はs3、s4テーブルには追加されていませんでした。
しかし、INSERST ALLの場合は、n = 1の s1 = ‘A’、s2 = ‘あ’ もs3、s4テーブルに追加されています。
つまり WHEN n <= 2の条件に当てはまるのであれば、 WHEN n <= 1の条件に関係なく行の追加がされるということです。
この部分がややこしいので気をつけるようにしましょう。
マルチテーブルINSERTの注意点


マルチテーブルINSERTで行を追加できるのは表のみになります。
ビューやリモート表(別のOracle DBにある表)には追加できません。
その部分に注意して使うようにしましょう。
まとめ
いかがでしたか?
今回は、Oracle DBのINSERT文について
- マルチテーブルINSERT
- マルチテーブルINSERTの注意点
の順番でご紹介しました!
ぜひ、身に付けてみてくださいね!
☟あわせて読みたい 「しう」のオススメブログ






コメント
コメント一覧 (2件)
ということは、INSERT FIRSTは先に条件を満たしたものsourceテーブルにある場合はそれ以降のWHENではINSERTされないということですね。
挙動としてはcase文ではなく、for 文に入っているcaseまたは if 文に近いという事でしょうかね。
for(row in rows){
if(condition){insert row into xxxx}
if else (condition){insert row into xxxx}
else (condition){insert row into xxxx}
}
コメントに書いていただいてる内容であっているかと思います!
for文の中に入っているif文という(INSERT FIRSTの)例はわかりやすいですね。
書いていただいている例のように一つ目のif文の条件に当てはまれば2つ目以降のif文の条件は関係ないという認識であっています!