Radim Marek:在PostgreSQL中使用MERGE超越简单的Upsert

💡 原文英文,约1600词,阅读约需6分钟。
📝

内容提要

PostgreSQL的MERGE命令在版本15中引入,并在版本17中进行了扩展,通过将多个操作合并为单个语句,可以实现更复杂的数据同步任务。它简化了复杂的工作流程,对于使用PostgreSQL的开发人员非常有用。文章提供了一个使用MERGE管理移动游戏的积分系统的实际示例。它将MERGE与传统的upsert方法进行了比较,并解释了MERGE如何简化数据库操作。文章还讨论了如何使用MERGE处理upserts和deletes,并介绍了在某些子句中指定DO NOTHING的能力。MERGE命令在PostgreSQL 17中进行了扩展,支持RETURNING子句以进一步处理合并的数据。

🔎

延伸解读

MERGE 与 ON CONFLICT 的适用场景对比

文章指出,ON CONFLICT 适合简单的 upsert 场景,但当业务逻辑变复杂时,它需要拆分成多个语句。MERGE 则能在单条语句中组合条件插入、更新和删除,并支持多个 WHEN 子句按顺序评估。因此,当同步任务涉及多种操作或条件分支时,MERGE 能减少语句数量,降低不一致风险。

MERGE 的删除能力与数据清理

传统 upsert 无法直接删除目标表中不存在于源数据的行。MERGE 通过 WHEN NOT MATCHED BY SOURCE THEN DELETE 子句,可以删除那些在源数据中缺失的记录。在示例中,这用于移除未参加上周锦标赛的玩家,从而维护积分系统的连续性。这一特性使 MERGE 适合数据归档和清理任务。

PostgreSQL 17 的 RETURNING 扩展

从 PostgreSQL 17 开始,MERGE 支持 RETURNING 子句,可以返回合并操作影响的数据。对于 INSERT 或 UPDATE,返回目标表列的新值;对于 DELETE,返回旧值。这允许在单条语句中完成数据合并并获取结果,便于后续处理,但需注意该功能在版本 17 中才可用。

❓

Q&A

PostgreSQL的MERGE命令有什么新特性?

MERGE命令在PostgreSQL 17中扩展,支持RETURNING子句,允许在合并数据后进一步处理。

MERGE命令如何简化数据库操作?

MERGE命令通过将多个操作合并为单个语句,简化了复杂的数据同步任务,减少了需要的语句数量。

MERGE命令与传统的upsert方法有什么区别?

MERGE命令能够处理更复杂的业务逻辑,通过单个语句同时执行插入、更新和删除,而传统的upsert方法通常需要多个语句。

如何使用MERGE命令处理删除操作?

MERGE命令可以通过WHEN NOT MATCHED BY SOURCE子句删除缺失的条目,适用于处理未参与比赛的玩家。

在移动游戏积分系统中如何应用MERGE命令?

在移动游戏积分系统中,MERGE命令用于根据玩家的参与情况更新积分和状态,简化了逻辑处理。

MERGE命令的使用场景有哪些?

MERGE命令适用于ETL操作、数据归档和清理任务等场景,能够处理复杂的数据操作。

🏷️

标签

➡️

继续阅读