PostgreSQL wikiから、
MERGE
は通常、2つのテーブルをマージするために使用され、2003 SQL標準で導入されました。REPLACE
ステートメント(MySQL拡張機能)または[〜#〜] upsert [〜#〜]シーケンスはUPDATE
、または失敗した場合はINSERT
。これはUPDATE
に似ていますが、一致しない行の場合はINSERT
です。同時アクセスが行の損失を引き起こす可能性のある変更を許可するかどうかは、実装に依存しません。
さらにPostgreSQLの INSERT ... ON CONFLICT DO NOTHING/UPDATE
は[〜#〜] upsert [〜#〜]として販売され、9.5で追加されました
では、MERGE
とは何ですか?そして、それはどのようにミックスに適合しますか?
一般的に、
UPSERT
はINSERT
から構築されていますMERGE
は、テーブルのマージ/同期に重点を置いて提供していますDELETE
サポート。UPSERT
には条件がありません。PostgreSQLでは、違反されたインデックスのプロキシによって、条件を指定する機能がありました。たとえば、
ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;
ON CONFLICT (country) DO NOTHING;
しかし、それは複数の条件を指定する機能も、どの条件でもDELETE
を実行する機能も提供しませんでした。どちらも、より豊富なルールのセットを許可し、「最小限の作業でテーブルを同期」できるようになっています。 MERGE
の目標になります。
別の問題として、 Peter Geogheganの投稿からいくつかの違いを強調しています "SQL MERGE
はUPSERTとはかなり異なります"