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

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.mzph.cn/bicheng/70582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】数据预处理之scikit-learn的Scaler与自定义Scaler类进行数据归一化

scikit-learn的Scaler数据归一化 一、摘要二、训练数据集和测试数据集的归一化处理原则三、scikit-learn中的Scalar类及示例四、自定义StandardScaler类进行数据归一化处理五、小结 一、摘要 本文主要介绍了scikit-learn中Scaler的使用方法,特别强调了数据归一化在…

DeepSeek介绍,以及本地部署和API使用

认识大模型 决策式ai 通过数据作分析和预测 生成式ai 基于历史数据进行创造,生成全新的内容 推理模型创新 GPT的o1慢思考 成本极高,功能强大 模型参数量大,推理速度相对更慢,处理复杂问题时需要较长的时间 DeepSeek的r1深度思…

MySQL视图索引操作

创建学生表; mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-> Ssex char(2) check (Ssex男 or Ssex女) not null,-> Sage int not null,-> Sdept varchar(10) default 计算机 not …

知识库升级新思路:用生成式AI打造智能知识助手

在当今信息爆炸的时代,企业和组织面临着海量数据的处理和管理挑战。知识库管理系统(Knowledge Base Management System, KBMS)作为一种有效的信息管理工具,帮助企业存储、组织和检索知识。然而,传统的知识库系统往往依…

Python 文字识别OCR

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

ximalaya(三) playUriList值解密--webpack

本文主要介绍解密音频播放url参数。 本文仅代表个人理解,如有其他建议可在评论区沟通。 声明 仅仅记录一下自己的学习方法,不作为其他参考、更不作为商业用途。如有侵犯请联系本人删除 目标地址:aHR0cHM6Ly93d3cueGltYWxheWEuY29tL3NvdW5k…

Linux之Http协议分析以及cookie和session

Linux之Http协议分析以及cookie和session 一.分析请求行与响应行1.1请求行1.1.1资源的URL路径1.1.2常见的方法1.2响应行 二.cookie和session2.1cookie2.2session 一.分析请求行与响应行 在我们简单了解了请求和响应的格式以及模拟实现了请求和响应后我们已经可以通过网页来访问…

【漫话机器学习系列】085.自助采样法(Bootstrap Sampling)

自助采样法(Bootstrap Sampling) 1. 引言 在统计学和机器学习领域,数据的充足性直接影响模型的性能。然而,在许多实际场景中,我们可能无法获得足够的数据。为了解决这个问题,自助采样法(Boots…

15vue3实战-----props和emit传值

15vue3实战-----props和emit传值 1.emit的使用2.配合props实现完整父子通信 vue3中props和emit的使用有点不一样,但万变不离其宗。 1.emit的使用 子组件: <script setup lang"ts"> // 定义触发的事件及其数据类型 const emit defineEmits([update, delete]…

nodejs - vue 视频切片上传,本地正常,线上环境导致磁盘爆满bug

nodejs 视频切片上传&#xff0c;本地正常&#xff0c;线上环境导致磁盘爆满bug 原因&#xff1a; 然后在每隔一分钟执行du -sh ls &#xff0c;发现文件变得越来越大&#xff0c;即文件下的mp4文件越来越大 最后导致磁盘直接爆满 排查原因 1、尝试将m3u8文件夹下的所有视…

金融资产配置

不要放在一个篮子里也不要放在太多篮子里&#xff1a; 尽量放在不相关的行业实现风险对冲 金融资产从风险类别上主要可以分为三类&#xff1a; 进攻型资产、稳定型资产和防守型资产 进攻型资产包括原油、股票、一级市场股权投资等 稳定型资产包括信托、理财、国债等 防守…

JavaScript 在 VSCode 中的优势与应用

JavaScript 在 VSCode 中的优势与应用 引言 随着前端技术的发展,JavaScript 已经成为了网页开发中最流行的编程语言之一。Visual Studio Code(简称 VSCode)作为一款轻量级、可扩展的代码编辑器,因其强大的功能和良好的用户体验,深受广大开发者的喜爱。本文将探讨 JavaSc…

公司配置内网穿透方法笔记

一、目的 公司内部有局域网&#xff0c;局域网上有ftp服务器&#xff0c;有windows桌面服务器&#xff1b; 在内网环境下&#xff0c;是可以访问ftp服务器以及用远程桌面登录windows桌面服务器的&#xff1b; 现在想居家办公时&#xff0c;也能访问到公司内网的ftp服务器和win…

qml前后端数据交互

在QML&#xff08;Qt Markup Language&#xff09;中进行前后端数据交互&#xff0c;通常涉及到使用Qt的C后端与QML界面进行通信。QML本身是一个声明式语言&#xff0c;负责界面和交互逻辑的部分&#xff0c;而C后端负责数据处理、逻辑控制以及与系统或网络的交互。以下是一些常…

ZU47DR 100G光纤 高性能板卡

简介 2347DR是一款最大可提供8路ADC接收和8路DAC发射通道的高性能板卡。板卡选用高性价比的Xilinx的Zynq UltraScale RFSoC系列中XCZU47DR-FFVE1156作为处理芯片&#xff08;管脚可以兼容XCZU48DR-FFVE1156&#xff0c;主要差别在有无FEC&#xff08;信道纠错编解码&#xff0…

【自然语言处理】利用Memory Layer替换Transformer中的FFN

论文地址&#xff1a;https://arxiv.org/pdf/2412.09764 相关博客 【自然语言处理】利用Memory Layer替换Transformer中的FFN 【自然语言处理】【大模型】BitNet&#xff1a;用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58&#xff1a;1bit LLM时代 【自然语言处理】…

ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

k8s中部署nginx的pod

在当今数字化的浪潮中&#xff0c;容器编排技术成为了构建和管理应用程序的核心力量。Kubernetes&#xff08;简称 k8s&#xff09;作为容器编排领域的佼佼者&#xff0c;凭借其强大的自动化部署、扩展和管理能力&#xff0c;深受开发者和运维人员的青睐。而 Nginx 作为一款高性…

台湾精锐APEX减速机在半导体制造设备中的应用案例

半导体制造设备对传动系统的精度、可靠性和稳定性要求极高&#xff0c;台湾精锐APEX减速机凭借其低背隙、高精度和高刚性等优势&#xff0c;在半导体制造设备中得到了广泛应用。 案例一&#xff1a;晶圆切割设备 1.应用场景 在晶圆切割过程中&#xff0c;设备需要高精度的运…

UV - Python 包管理

文章目录 创建 uv 项目已有项目已有uv项目 创建 uv 项目 # 创建项目 uv init m3 # 创建环境 cd m3 uv venv --python 3.11 # 激活环境 source .venv/bin/activate # 添加库 uv add flask 如果创建项目后&#xff0c;给库取别的名字&#xff0c;add 的时候&#xff0c;会…