SQL MERGE

从 PostgreSQL wiki
跳至导航跳至搜索

状态

注意: MERGE 常常(错误地)可与术语 UPSERT 互换使用。

UPSERT 功能将位于PostgreSQL 9.5版本中 -- 参见 PostgreSQL 9.5 的新功能

Simon Riggs 提议了一个补丁,作为 Postgres v11 发布周期的一部分,在 2017 年实施 MERGE。请参见 专用的 wiki 页面 了解详情。

描述

MERGE 通常用于合并两个表,并且在 2003 SQL 标准 中引入。REPLACE 语句(MySQL 扩展)或 UPSERT 序列会尝试执行 UPDATE,或在失败时执行 INSERT。这类似于先 UPDATE,然后对于不匹配的行执行 INSERT。并发访问是否允许会导致可能造成行丢失的修改,这取决于实施方式。

要干净地实施此操作,需要表具有唯一索引,以便可以轻松地执行重复检查。如果要求用户在 MERGE 之前 LOCK 表,那么可以在没有唯一索引的情况下进行操作。

历史记录

PostgreSQL 中 MERGE 进度的讨论

可能的实现顺序

注意:本部分内容编写于 2010 年,可能无法反映目前的进展。

由于需要采用特定的方式对这一特性进行内部实现,因此该特性将以以下顺序建立

  1. PostgreSQL 没有一个很好的方法来锁定对尚未存在的关键值的访问,其他数据库将此称为键范围锁定(例如 SQL Server)。需要对索引实现进行改进,以允许此特性。
  2. 添加足够的支持 MERGE 子集,以实现 REPLACE/UPSERT。完整的 MERGE 特性集则比这要广泛一些。
  3. 记录如何使用新的 MERGE 特性来替代 REPLACE/UPSERT,以方便其他数据库用户进行过渡。将其他供应商的非标准语法添加到其中,以实现其他应用程序透明运行不太可能被接受为补丁。
  4. 完整实现 SQL MERGE 的特性集。