データの登録・更新
テーブルから登録・更新を行う
データの登録と更新を一度に行うには、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をつけています。
1 2 3 4 5 6 7 8 |
MERGE INTO item USING item_new new ON item.id = new.id WHEN MATCHED THEN UPDATE SET name = new.name, price = new.price, comment = new.comment WHEN NOT MATCHED THEN INSERT (id, name, price, comment) VALUES (new.id, new.name, new.price, new.comment); |
上記を実行後の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をつけています。
1 2 3 4 5 6 7 8 9 |
MERGE INTO item USING (SELECT 3 id, 'すいか' name, 200 price, '新規取扱' comment FROM DUAL) new ON item.id = new.id WHEN MATCHED THEN UPDATE SET name = new.name, price = new.price, comment = new.comment WHEN NOT MATCHED THEN INSERT (id, name, price, comment) VALUES (new.id, new.name, new.price, new.comment); |
上記を実行後のitemテーブルがこちらです。
id | name | price | comment |
---|---|---|---|
1 | りんご | 100 | ジューシー |
2 | レモン | 150 | null |
3 | すいか | 200 | 新規取扱 |
指定したidがitemテーブルに存在しなかったため、登録されているのがわかります。
以上が、登録と更新を同時に実行する「MERGE」の使い方です。
ぜひ参考にしてみてください。