PostgreSQL 18新特性之DML语句RETURNING增强

embedded/2025/2/11 17:25:18/

PostgreSQL 很早就支持 DML 语句的 RETURNING 子句,用于返回插入、更正或者删除的数据。例如:

CREATE TABLE t(id int, v numeric);
INSERT INTO t(id, v) VALUES(1,1);
INSERT INTO t(id, v) VALUES(2,5);
INSERT INTO t(id, v) VALUES(3,10);UPDATE t
SET v = 123 
WHERE id IN (1,2,3)
RETURNING id, v;id │  v
────┼─────112321233123
(3 ROWS)

以上示例中的 RETURNING 返回了被更新后的数据,但是无法返回被更新前的原始数据。

我们可以使用通用表表达(CTE)获取被更正前的数据,但是这种方法比较复杂难懂:

WITHx AS (SELECT id, v FROM t WHERE id IN (1,2,3) FOR UPDATE),u AS (UPDATE t SET v = 123 FROM x WHERE t.id = x.id RETURNING t.id, t.v)SELECT COALESCE(x.id, u.id), x.v AS BEFORE, u.v AS AFTERFROM x FULL OUTER JOIN u USING (id);COALESCE │ BEFORE │ AFTER
──────────┼────────┼───────1112325123310123
(3 ROWS)

PostgreSQL 18 已经提交了一个新的增强,可以支持在 INSERT、UPDATE、DELETE、MERGE 语句的 RETURNING 子句中使用特殊的别名 old 以及 new 返回被修改后或者修改前的数据。例如:

UPDATE t 
SET v = least(123 * v, 200) 
WHERE id IN (1,2,3) 
RETURNING id, OLD.v, NEW.v;id │ v  │  v
────┼────┼─────1112325200310200
(3 ROWS)

其中,old 代表了被修改前的记录,new 代表了被修改后的记录。

对于 INSERT 语句,old 数据通常为 NULL;对于 DELETE 语句,new 数据通常为 NULL。但是对于 INSERT ON CONFLICT … DO UPDATE 语句,或者使用查询重写规则改变了命令类型时,old 数据可能不为 NULL。

另外,我们也可以为 old 或者 new 指定自定义的别名:

RETURNING WITH (OLD AS o, NEW AS n) o.colname, n.colname, ...
RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*

这个功能对于一些特殊场景非常有用,例如触发器函数(它们的定义也存在 old 和 new 关键字),或者使用了 old 或 new 关键字的历史代码。


http://www.ppmy.cn/embedded/161381.html

相关文章

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章,支持多种AI服务(如OpenAI、百度文心一言、智谱AI等),并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成:根据输入的关键词生成高质量文章。 内容…

唯一值校验的实现思路(续)

本文接着上一篇文章《唯一值校验的实现思路》,在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增,如果是传入true;反之传入false* return void* date…

WPS计算机二级•文档的文本样式与编号

听说这是目录哦 标题级别❤️新建文本样式 快速套用格式🩷设置标题样式 自定义设置多级编号🧡使用自动编号💛取消自动编号💚设置 页面边框💙添加水印🩵排版技巧怎么分栏💜添加空白下划线&#x…

安当SLA操作系统登录双因素认证:全方位保障Windows系统登录安全

一、产品概述 在当今数字化时代,Windows系统面临着诸多安全挑战,如弱口令问题等。安当SLA(System Login Agent)作为一款强大的双因素登录认证产品,通过支持OTP动态口令和USBKey硬件令牌认证,有效解决多种W…

【Linux第二章】Linux内核与权限

【Linux第二章】Linux内核与权限 Linux内核🧐 1.内核简述✨ Linux内核是操作系统的“心脏”,它直接与电脑的硬件(CPU、内存、硬盘等)打交道。它不仅负责CPU资源调度,也管理资源拷贝、转移,甚至动一下鼠标…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的装饰工程管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql实现的装饰工程管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面…

Docker在安装时遇到的问题(第一部分)

一、在用docker-config-manager安装yum源时出现错误 [rootlocalhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 已加载插件:fastestmirror, langpacks adding repo from: https://download.docker.com/linux/ce…

讯飞绘镜(ai生成视频)技术浅析(五):视频生成

讯飞绘镜(AI生成视频)是一种先进的AI视频生成技术,能够将静态的分镜画面转换为动态视频,并使画面中的元素按照一定的逻辑和动作进行动态展示。 一、讯飞绘镜视频生成技术概述 讯飞绘镜的视频生成技术主要包含以下几个核心模块: 1.视频生成模型:包括生成对抗网络(GAN)…