UPSERT 和 MERGE 的区别?

Eva*_*oll 3 postgresql terminology merge upsert

从 PostgreSQL 维基,

MERGE通常用于合并两个表,并在 2003 SQL 标准中引入。该REPLACE声明(一个MySQL扩展)或UPSERT序列尝试一个UPDATE或失败时INSERT。这类似于UPDATE,然后对于不匹配的行,INSERT。并发访问是否允许可能导致行丢失的修改与实现无关。

进一步的 PostgreSQLINSERT ... ON CONFLICT DO NOTHING/UPDATEUPSERT的形式销售,并在 9.5 中添加

那是MERGE什么?它是如何融入这个组合的?

Eva*_*oll 5

一般来说,

  • UPSERT 是建立在 INSERT
  • MERGE 专注于合并/同步表并提供
    • 条件性(where 子句)
    • DELETE 支持。

UPSERT 缺乏条件,例如,在 PostgreSQL 中,您可以通过代理被违反的索引来指定条件

ON CONFLICT ON CONSTRAINT countries_pkey DO NOTHING;
ON CONFLICT (country) DO NOTHING;
Run Code Online (Sandbox Code Playgroud)

但是它没有提供指定多个条件的能力,也没有提供DELETE在任何条件下的能力,这两者都允许更丰富的规则集,使得“以最少的工作同步表”成为可能,这似乎是MERGE.

另一方面,来自Peter Geoghegan 的帖子强调了一些差异“SQLMERGE与 UPSERT 完全不同”

  • UPSERT 是原子的 插入或更新
  • SQL MERGE 在技术上不需要唯一索引。

也可以看看