合并支持函数
这里的“合并”指 SQL MERGE 语句,不是拼接字符串或合并范围。PostgreSQL 18 提供 merge_action(),在 MERGE ... RETURNING 中报告当前输出行实际执行的动作;旧版 PostgreSQL 不支持时应先核对服务器版本。
查看每行采取的动作
MERGE INTO inventory AS i
USING (VALUES (1, 12), (2, 5)) AS s(id, quantity)
ON i.id = s.id
WHEN MATCHED THEN
UPDATE SET quantity = s.quantity
WHEN NOT MATCHED THEN
INSERT (id, quantity) VALUES (s.id, s.quantity)
RETURNING merge_action() AS action, i.id, i.quantity;
假设 inventory 已有 id = 1 而没有 id = 2,输出动作分别是 UPDATE 与 INSERT。merge_action() 返回文本 'INSERT'、'UPDATE' 或 'DELETE';具体出现哪种动作取决于匹配结果和 WHEN 分支。它只能放在 MERGE 的 RETURNING 列表中,不能放在 WHEN 条件、普通 SELECT 或其他位置。
结果边界
DO NOTHING 不产生对应的 RETURNING 行;不能用返回的行数直接代表源表总行数。匹配同一目标行多次可能导致错误或非预期动作,应先保证源数据与目标键的关系符合预期。RETURNING 可同时返回操作结果与目标行字段,适合审计本次修改,但长期审计仍需事务化地保存记录。权限和触发器也可能影响实际可见的结果;将这个函数视作已执行动作的报告,不是预判动作的条件函数。