web-dev-qa-db-ja.com

UPSERTとMERGEの違いは何ですか?

PostgreSQL wikiから、

MERGEは通常、2つのテーブルをマージするために使用され、2003 SQL標準で導入されました。 REPLACEステートメント(MySQL拡張機能)または[〜#〜] upsert [〜#〜]シーケンスはUPDATE、または失敗した場合はINSERT。これはUPDATEに似ていますが、一致しない行の場合はINSERTです。同時アクセスが行の損失を引き起こす可能性のある変更を許可するかどうかは、実装に依存しません。

さらにPostgreSQLの INSERT ... ON CONFLICT DO NOTHING/UPDATE[〜#〜] upsert [〜#〜]として販売され、9.5で追加されました

では、MERGEとは何ですか?そして、それはどのようにミックスに適合しますか?

1
Evan Carroll

一般的に、

  • UPSERTINSERTから構築されています
  • MERGEは、テーブルのマージ/同期に重点を置いて提供しています
    • 条件性(where句)
    • DELETEサポート。

UPSERTには条件がありません。PostgreSQLでは、違反されたインデックスのプロキシによって、条件を指定する機能がありました。たとえば、

ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;
ON CONFLICT (country) DO NOTHING;

しかし、それは複数の条件を指定する機能も、どの条件でもDELETEを実行する機能も提供しませんでした。どちらも、より豊富なルールのセットを許可し、「最小限の作業でテーブルを同期」できるようになっています。 MERGEの目標になります。

別の問題として、 Peter Geogheganの投稿からいくつかの違いを強調しています "SQL MERGEはUPSERTとはかなり異なります"

  • UPSERTはそのinsert-or-updateでアトミックです
  • SQL MERGEは技術的にUNIQUE INDEXを必要としません。

こちらもご覧ください

3
Evan Carroll