PostgreSQL 19 重磅新语法终于补齐这个缺口

PostgreSQL的merge范例 阅读详情

在 PostgreSQL 中,INSERT ... ON CONFLICT 是处理 Upsert(插入或更新) 的核心语法之一。

自 PostgreSQL 9.5 引入该能力以来,开发者已经可以在插入冲突时选择 忽略记录(DO NOTHING) 或 更新记录(DO UPDATE)。

在 PostgreSQL v19 中,这一语法进一步扩展:新增 ON CONFLICT ... DO SELECT。
当插入操作发生冲突时,可以直接返回已有记录,从而避免额外的查询操作。

这一特性为 “插入并返回记录” 的常见业务场景提供了更简洁的实现方式。

什么是 INSERT … ON CONFLICT?

INSERT … ON CONFLICT 是 PostgreSQL 实现 upsert 的语法,用于在插入数据时处理冲突行:当目标表中已存在冲突记录时,可以选择保持原记录不变或对其进行更新。

保持原记录不变可使用 ON CONFLICT DO NOTHING;更新冲突记录则使用 ON CONFLICT ... DO UPDATE SET ...。在执行更新时,需要指定冲突目标(conflict target),即用于检测冲突的约束(constraint)或唯一索引(unique index)。

之所以提供该语法,是因为其行为不同于 SQL 标准中的 MERGE。INSERT … ON CONFLICT 不存在竞态条件,在并发修改场景下仍能保证操作结果必然为 INSERT 或 UPDATE,不会因并发事务在两者之间删除冲突行而导致失败。

一个 MERGE 的并发问题示例

首先创建测试表:

CREATE TABLE tab (key integer PRIMARY KEY, value integer);

开启事务并插入数据:

BEGIN;

INSERT INTO tab VALUES (1, 1);

在另一个并发会话执行 MERGE:

MERGE INTO tab
USING (SELECT 1 AS key, 2 AS value) AS source
   ON source.key = tab.key
WHEN MATCHED THEN UPDATE SET value = source.value
WHEN NOT MATCHED THEN INSERT VALUES (source.key, source.value);

此时 MERGE 语句会被阻塞,当插入事务提交后,MERGE 直接报错:

ERROR:  duplicate key value violates unique constraint "tab_pkey"
DETAIL:  Key (key)=(1) already exists.

而使用 INSERT ... ON CONFLICT ... DO UPDATE,则可以正确更新数据:

INSERT INTO tab VALUES (1, 2)
   ON CONFLICT (key)
   DO UPDATE SET value = EXCLUDED.value;

这说明 INSERT ... ON CONFLICT 在并发场景下更可靠。

PostgreSQL v19 新增 ON CONFLICT … DO SELECT

INSERT 或 UPDATE 的语义很容易理解,而 INSERT 或 SELECT 看起来可能有些反直觉。

实际上,DO SELECT 的含义是:

如果插入成功,则返回新插入的数据;
如果发生冲突,则直接返回已有记录。

该功能需要与 INSERT ... RETURNING 一起使用。

PostgreSQL v19 中的语法如下:

DO SELECT [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } ] [ WHERE condition ]

其中:

  • 可以为返回的行添加行级锁。
  • 返回列由 RETURNING 子句决定。

由于 SQL 语句返回的结果结构必须一致,因此 PostgreSQL 直接使用 RETURNING 列表作为 SELECT 的返回列。

DO SELECT 的典型使用场景

当 INSERT ... RETURNING 本身有价值时,DO SELECT 往往也非常有用。例如:

  • 需要插入并返回记录 ID。
  • 表中存在数据库自动生成字段。
  • 字段会被触发器修改。
  • 使用会进行截断或转换的数据类型。

在这些情况下,INSERT ... RETURNING 可以直接返回数据库最终存储的结果,而无需再执行额外查询。

经典示例:插入或返回已有记录

创建示例表:人员表,社保号唯一,ID 自增。

CREATE TABLE person (
   id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   svnr varchar(10) UNIQUE NOT NULL,
   name text NOT NULL
);

插入数据并返回自动生成的 ID:

INSERT INTO person (svnr, name) VALUES
   ('1750201068', 'Laurenz')
RETURNING id;

如果插入的数据可能已经存在,可以忽略冲突:

INSERT INTO person (svnr, name) VALUES
   ('1750201068', 'Laurenz'),
   ('1053080982', 'mary')
ON CONFLICT (svnr) DO NOTHING;

但如果同时希望获取已存在记录的 ID,则可以使用 DO SELECT:

INSERT INTO person (svnr, name) VALUES
   ('1750201068', 'Laurenz'),
   ('1053080982', 'mary')
ON CONFLICT (svnr) DO SELECT
RETURNING id;

这样无论记录是新插入还是已经存在,都能够返回对应的 ID。

在旧版本 PostgreSQL 中的替代方案

在 PostgreSQL v19 之前,可以通过 DO UPDATE 实现类似效果:

INSERT INTO person (svnr, name) VALUES
   ('1750201068', 'Laurenz'),
   ('1053080982', 'mary')
ON CONFLICT (svnr) DO UPDATE SET name = person.name
RETURNING id;

这种写法虽然能够返回正确结果,但存在明显缺点:

  • 每次 UPDATE 都会产生 死元组(dead tuple),需要 VACUUM 清理。
  • 如果不是 HOT 更新,所有索引都需要被修改。
  • 即使数据未变化,也会产生额外写入开销。

因此在性能和存储效率上并不理想。

为什么没有 ON CONFLICT … DO DELETE

这种语法几乎没有实际应用场景,因此没有被引入。

相比之下,用户更希望增加的能力是:

在 ON CONFLICT 子句中支持多个冲突约束(arbiter constraint),而不仅仅是一个。

总结

PostgreSQL v19 新增的 ON CONFLICT ... DO SELECT,为 INSERT ... ON CONFLICT 语法补齐了一个重要能力。

该特性在以下场景中尤为实用:

  • 需要插入或获取已有记录
  • 表字段由数据库自动生成
  • 数据会被触发器修改
  • 需要在插入时直接获取最终存储结果

通过这一增强,PostgreSQL 在 Upsert 语义和返回结果处理方面变得更加完整,也减少了业务层额外查询的复杂度。

原文链接:

https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/

作者:Laurenz Albe

ArcGIS中如何计算多个点到特定线的最短距离 现有一个点图层和一个面图层,怎么来计算这些点到这个面图层,两个面的公共边的最短直线距离呢? 1.首先得将两个图层都转为 投影坐标系 打开工具箱-数据管理工具-要素-面转线 ​ ​ 2.将面图层设为输入要素 注意要将“识别和存储面邻域信息”勾选 ​ 3.面转线成功后 打开线属性表,线图层拥有了 LEFT_FID和RIGHT_FID两个字段 ​ 4.按属性选择,表达式中输入 “LEFT_FID”<>-1 即可选出两个面的公共边 ​再将选... 阅读详情

相关推荐

il2cpp分析-gobal-metadata.dat解密

打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。

Android_machong的博客 8025

Postgres实现Merge

前言 Oracle迁移PG过程中遇到Merge语法的处理。PG 11开始支持Merge语法,但项目使用PG 10,所以要对代码中的Merge语句进行重写。 什么是Merge? Oracle数据库MERGE语句_周末未至-优快云博客_merge oracle PG实现Merge的最佳实践 Best practices for migrating Oracle database MERGE statements to Amazon Aurora PostgreSQL and Amazon RDS P

bin9wei的博客 4701

基于MySQL的京东用户行为分析

对京东用户行为的分析,利用AARRR模型进行分析。

SelenaSelena的博客 1911

PG 15 Merge Into语法测试

Merge语法的六种使用模式

多米爸比的专栏 1477

windows10下Boost的安装与初试

https://blog.youkuaiyun.com/s_lisheng/article/details/72871218 https://blog.youkuaiyun.com/yockie/article/details/8856190?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-12.vipsorttest&depth_1-utm_source=dis

焦露的博客 6397

LM Studio 模型加载与转换实战指南:从GGUF格式到本地部署

本文提供了使用LM Studio加载与转换GGUF格式大语言模型的完整实战指南。详细阐述了为何GGUF格式是本地部署的最佳选择,并逐步指导用户如何将非GGUF模型(如Transformers格式)转换为GGUF格式,以及在LM Studio中进行加载、配置GPU卸载等关键优化,最终实现流畅的本地离线对话体验。

weixin_29061425的博客 924

PG数据库实现merge into方法

3、select出来的字段名称必须和目标表中的字段名称一致。2、关联字段必须在表中字段顺序的第一个位置。1、conflict 里的字段必须是主键。

白元霞的博客 2086

SAP项目结算核心:结果分析码配置与KKA2/CJ88排错实战

结果分析码(RA Key)是SAP CO模块中实现项目收入确认与成本分摊的核心机制,其本质是一套融合时间逻辑、价值计算与责任归属的动态规则引擎。它并非简单映射会计科目,而是驱动KKA2和CJ88执行项目实际结算的关键算法,直接影响毛利真实性与财务合规性。在EPC、工程服务及多阶段合同场景下,错误选用RA01等默认配置极易导致收入虚增、税务风险与管理失真。本文结合sap ko88 增强与sap mdvp主数据校验等高频实践痛点,系统解析时间确定方法、值确定方法与结果分析类型三大维度,并提供五层穿透式排查链路,

weixin_34355559的博客 343

Oracle、MySQL、SqlServer、PG数据库merge into语法实现总结

概述 多表关联查询的时候会用到临时表插入数据,然后再用select查行查询,在往临时表里插入数据的时候,我们经常会用到判断如果临时表里有了这部分数据我们就要更新数据,如果临时表里没有这部分数据我们就要插入,这个时候可以怎么去实现呢? 下面介绍各类型数据库实现的大致方式。 一、存储过程实现 各类型数据库都可以通过存储过程实现,因为是共性问题,所以就放前面了,这里以mysql数据库的存储过程为例。 1、环境准备 --建表 create table t1( id bigint(10), name varcha

淡定波的博客 7144

深入解析DDR5 RFM机制:从JESD79-5标准到硬件实现

本文深入解析了DDR5内存标准中的关键机制——RFM(Refresh Management)。文章从JESD79-5标准出发,详细阐述了RFM如何通过RAA计数器实现从被动定时到主动响应的智能刷新管理,并探讨了其硬件实现细节、命令调度挑战及系统级设计考量,为芯片设计工程师优化DDR5内存子系统性能与可靠性提供了实践指导。

fff88的博客 492

HTOL集成电路老化测试学习总结-20250510

电子元器件的可靠性在产品开发中至关重要,尤其是在微电子技术迅速发展的今天。电子元器件的失效率通常遵循“浴盆曲线”,分为早期失效期、可使用期和老化期。为了评估芯片的可靠性,常采用高温操作寿命测试(HTOL),通过高温和高压加速芯片老化,以筛选出早期失效的芯片并评估其长期可靠性。HTOL测试中,芯片在高温下运行并监控其性能变化,通过阿伦尼乌斯公式计算加速因子,预测芯片的失效率和寿命。此外,Burn-in测试用于加速芯片老化,提前发现并剔除不合格产品,而早期失效率测试(ELFR)则用于评估产品初期使用阶段的可靠性

歌颂苦难的行为是无耻的; 2106

PostgreSQL 19重磅升级:VALUES子句直接JOIN,告别IN列表与UNION ALL的繁琐

在数据库查询中,处理临时数据集或值列表关联是常见需求。传统方法如IN子句在长列表时存在性能不确定性,UNION ALL则语法冗长。其核心原理在于将一组值作为临时表参与关系运算,这能更清晰地表达查询意图,并有助于优化器生成更优执行计划。从技术价值看,这提升了代码的可读性、可维护性,并能在批量数据校验、动态报表等场景中简化复杂操作。PostgreSQL 19引入的VALUES子句增强语法,正是对这一需求的直接回应,它允许VALUES在FROM子句中作为表源直接进行JOIN和WITH ORDINALITY操作,实

weixin_30768881的博客 308

手把手教你完成YOLOv8 PyQt5和PySide6目标检测界面搭建,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv8 与 PyQt5,构建了一个图形化界面,便于用户进行目标检测的操作和展示,实现对图片、视频和摄像头的实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。支持目标检测、目标分割等模型进来检测

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

MySQL9.0|融合向量的新一代关系数据库安装配置教程

Oracle 旗下开源关系型数据库,基于 InnoDB 主存储引擎,核心定位:传统 OLTP 业务 + 原生 AI 向量存储 + 安全标准化升级。

2601_95090589的博客 315

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pg数据库 实现merge

merge 语法用于将一张表的数据合并到另外一张表。根据某个唯一条件插入或更新数据。可以用于因为是在一个语句中实现了插入和更新的处理,所以看起来更加简洁、高效。oracle 和 pg新旧版本的 merge 实现方法

n2_bnxf的博客 773

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PostgreSQL实现Oracle merge into功能

PostgreSQL实现Oracle merge into功能

淮城一只猫 4999

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

PG Merge语法使用

从PostgreSQL15开始支持Merge Into语法,以前版本可以使用insert ... do conflicts语法。目标机器 100.51 PostgreSQL 17.4 (编译安装的时候需要把dblink扩展加上)源机器 100.138 PostgreSQL 11.5。数据情况如下:图层名字maincity(源和目标结构相同)2. 在目标机器上创建dblink,以方便连接到源机器。3. 把objectid小于1200的同步过来。

风的专栏 530

PostgreSQL 17新特性之MERGE语句增强

PostgreSQL 17 增强了MERGE语句的功能,包括:支持 RETURNING 子句,可以返回新增、更新或者删除的数据行;支持 WHEN NOT MATCHED BY SOURCE 操作,用于操作源表中不存在但是目标表中存在的数据行。

Tony.Dong的专栏 2633

pgsql merge方法

在网上看到很多关于psql的merge方法,很多都是用函数function来实现的,其实在pgsql10以后可以通过sql来直接实现merge方法 具体语法如下:   with "别名" as (update 表名 set 字段名1= '更新的值',字段名2='更新的值' where 主键=需要更新的主键的值 returning *) insert into表名(字段名1,字段名2) se...

weixin_30835649的博客 4157

PostgreSQL 15 新特性:对数据存储与管理的革新

PostgreSQL 15 在数据存储与管理方面的革新为用户带来了诸多实际利益,无论是在性能提升、功能扩展还是在数据管理的灵活性和可靠性方面,都取得了显著的进步。这些新特性不仅满足了当前日益增长的数据处理需求,也为未来数据库技术的发展奠定了坚实的基础。随着数据量的持续增长和应用场景的不断复杂化,我们可以期待 PostgreSQL 在后续版本中继续推出更多创新的功能和优化。

数字魔方操控师的博客 958

PG14合并库

开发要求将1个服务器上的2个系统库合并到同服务器上的1个新库中,要求用命令行实现,不让用工具。

qq961573863的博客 519

PostgreSQL 19即将发布:面向生产环境的全面进化

PostgreSQL 19 已经进入 Beta 测试阶段,预计会在今年秋季正式发布。本文列举了与工程生产密切相关的几个方向,方便大家做一个参考。

Tony.Dong的专栏 428

postgresql新特性之Merge

【代码】postgresql新特性之Merge。

Java_Fly1的博客 1433

DeepSeek总结的PostgreSQL v19 新特性:INSERT ... ON CONFLICT ... DO SELECT

PostgreSQL v19 引入新特性 INSERT ... ON CONFLICT ... DO SELECT,完善了已有的 upsert 功能。该特性允许在插入冲突时直接返回现有行数据,特别适用于需要获取生成列或触发器修改后的数据场景。相比旧版中使用 DO UPDATE 的变通方案,新语法避免了不必要的更新开销和死元组问题。文章通过示例展示了该特性的使用场景,并与标准 MERGE 语句的竞态条件问题进行了对比。这一改进为需要获取完整插入结果的场景提供了更高效的解决方案。

l1t的专栏 597

PostgreSQL merge join扫描弊端与优化

PostgreSQL 支持三种JOIN方法,它们分别是nestloop, hash, merge join。其中merge join扫描方法大致为:先按照join key对两表排序,然后按JOIN KEY顺序扫描,两个JOIN对象都只扫描一次。 当其中一个表上存在过滤条件时,自然是只需要对满足条件的数据进行排序即可。但是另一张表呢?正常来说,因为只取两表关联的数据,所以另一张表也只需要对应的满足条...

Focus on PostgreSQL 2946

PostgreSQL类似Oracle MERGE功能的实现

文章目录概述语句详解小测试建两张表数据部分重叠执行merge语句一个注意点 概述 MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE 而Postgre...

高云平的博客 1万+
上一篇: PostgreSQL 技术日报 (3月23日)|使用 rdtsc 减少 EXPLAIN ANALYZE 的计时开销
下一篇: PostgreSQL 技术日报 (3月24日)|当 MVCC 成本被重新审视
IvorySQL
博客等级 码龄5年 745粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值