MERGE文とは?
SQLのMERGE
文は、対象テーブルにデータが存在する場合はUPDATE、存在しない場合はINSERTを1回の処理でまとめて行える便利な構文です。
従来は「UPDATE → 該当しなければINSERT」といった2回の処理が必要でしたが、MERGEを使うことで1回のSQLで済むため、処理効率やパフォーマンスが向上します。
本記事ではOracleをベースに解説しつつ、他DBでの対応についても補足します。
MERGE文の基本構文(Oracleの場合)
1 2 3 4 5 6 7 8 9 |
MERGE INTO 対象テーブル T USING 参照元テーブル S ON (T.キー = S.キー) WHEN MATCHED THEN UPDATE SET T.カラムA = S.カラムA, T.カラムB = S.カラムB WHEN NOT MATCHED THEN INSERT (カラムA, カラムB, カラムC) VALUES (S.カラムA, S.カラムB, S.カラムC); |
実用例①:顧客マスタの更新 or 追加
✅ ID=C001
が存在すれば更新
✅ 存在しなければ新規追加
処理の流れ(フロー図で理解)
応用例②:条件によってDELETEも行う(Oracle/SQL Server対応)
✅ ステータスがCANCELなら削除
✅ そうでなければ更新
✅ 該当なしならINSERT
MERGE文のメリット
項目 | 従来方法 | MERGE文 |
---|---|---|
SQL実行回数 | UPDATEとINSERTの2回 | 1回 |
パフォーマンス | やや低い | 高い |
ロジックの明確さ | 分岐が必要 | 条件分が整理されやすい |
メンテナンス性 | 低め | 高い |
注意点
注意点 | 内容 |
---|---|
ロックの影響 | 大量データの場合、テーブルロックが発生しやすい |
複雑な条件 | WHEN句が増えると可読性が下がる |
DB依存性 | MySQLは8.0.19以降、PostgreSQLはINSERT ... ON CONFLICTで代替 |
他DBでの補足
DB | MERGE対応 | 備考 |
---|---|---|
Oracle | 対応 | 本記事基準 |
SQL Server | 対応 | ほぼ同構文 |
MySQL | 8.0.19~対応 | REPLACE/INSERT ON DUPLICATEも可 |
PostgreSQL | 15~対応 | それ以前はINSERT ON CONFLICT |
まとめ
✅ MERGE文はINSERTとUPDATEを1回の処理にまとめる強力なSQL構文
✅ DELETEも組み合わせれば高度なロジックも実現可能
✅ Oracle・SQL Serverでは標準的に使用される
✅ MySQL/PostgreSQLではバージョン確認が必要
「同じキーのデータを更新 or 追加したい」場面で積極的に使いましょう!