登録・更新・削除

[Oracle] データ登録・更新SQL(MERGE)

データの登録・更新

テーブルから登録・更新を行う

データの登録と更新を一度に行うには、MERGEを使用します。
少し記述が長いですが、パーツごとに分けてみると登録や更新とそれほど違いはありません。

MERGE INTO テーブル1 USING テーブル2
ON テーブル1.列1 = テーブル2.列1
— 結合キーが既存データと一致した場合
WHEN MATCHED THEN
 — テーブル名は指定しない
 UPDATE SET
  列1 = テーブル2.列1, 列2 = テーブル2.列2 ・・・
— 結合キーが既存データと一致しなかった場合
WHEN NOT MATCHED THEN
 — INTO テーブル名は指定しない
 INSERT (列1, 列2 ・・・ )
 VALUES (テーブル2.列1, テーブル2.列2 ・・・ );

それではサンプルを見てみましょう。
以下のようなitemテーブル(上)、item_newテーブル(下)があります。
itemテーブルを最新情報に更新するイメージです。

id name price comment
1 りんご 100 ジューシー
2 レモン 150 null

id name price comment
1 りんご 100 ジューシー
2 レモン 160 すっぱい
3 すいか 200 新規取扱

itemテーブルをitem_newテーブルで更新するためのSQLです。
item_newテーブルには、別名newをつけています。

上記を実行後のitemテーブルがこちらです。

id name price comment
1 りんご 100 ジューシー
2 レモン 160 すっぱい
3 すいか 200 新規取扱

item_newテーブルの内容で更新されているのがわかります。

 

値を指定して登録・更新を行う

値を指定してマージするには、USING句にSELECT文を指定します。
DUALというテーブルはOracleのSYSユーザのスキーマにあらかじめ用意されたダミーテーブルです。

MERGE INTO テーブル1
USING (SELECT 値1, 値2 ・・・ FROM DUAL) 別名
ON テーブル1.列1 = 別名.列1
— 結合キーが既存データと一致した場合
WHEN MATCHED THEN
 — テーブル名は指定しない
 UPDATE SET
  列1 = 別名.列1, 列2 = 別名.列2 ・・・
— 結合キーが既存データと一致しなかった場合
WHEN NOT MATCHED THEN
 — INTO テーブル名は指定しない
 INSERT (列1, 列2 ・・・ )
 VALUES (別名.列1, 別名.列2 ・・・ );

それではサンプルを見てみましょう。
以下のようなitemテーブルがあります。

id name price comment
1 りんご 100 ジューシー
2 レモン 150 null

itemテーブルに、指定したデータを登録、更新するSQLです。
USING句で指定したSELECT結果に別名newをつけています。

上記を実行後のitemテーブルがこちらです。

id name price comment
1 りんご 100 ジューシー
2 レモン 150 null
3 すいか 200 新規取扱

指定したidがitemテーブルに存在しなかったため、登録されているのがわかります。
 
 

以上が、登録と更新を同時に実行する「MERGE」の使い方です。
ぜひ参考にしてみてください。