【PostgreSQL里insert on conflict do操作时的冲突报错分析】

最近在巡检PostgreSQL的数据库的时候,发现部分数据库里存在大量的如下报错

ERROR:  ON CONFLICT DO UPDATE command cannot affect row a second time
HINT:  Ensure that no rows proposed for insertion within the same command have duplicate constrained values.

image.png

一、问题分析

通过报错的字段可以看出是使用了PostgreSQL 9.5 引入的一项新功能,insert on conflict do功能,即UPSERT的效果,当插入遇到约束错误时,直接返回,或者改为执行UPDATE。观察日志可以看出执行的SQL是带有多条记录的,推测多条记录的key值冲突了,因此报了这个错。

PostgreSQL 的 upsert 功能:当记录不存在时,执行插入;否则,进行更新。

PostgreSQL的代码里src/backend/executor/nodeModifyTable.c下的ExecOnConflictUpdate()函数里的注释部分其实解释的很清楚了。当在同一命令中再次更新刚插入的元组时,可能会发生这种情况。例如,因为插入了多个具有相同冲突键值的行。

MERGE 也有同样的问题,SQL-2003标准也类似地规定MERGE,在尝试更新同一行两次时必须引发异常。因为一次请求中对行的处理,顺序是不固定的,数据库不知道应该以哪条为最后需要保留的数据。

注释部分也明确表示出现这种问题属于用户的责任,PostgreSQL不会主动去处理这种报错,这种不在同一条SQL中出现多条相同KEY的数据的问题应该让用户去保障。

image.png

二、问题复现

1.建立测试表


postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:09:21)=# create table test(id int primary key, info text, crt_time timestamp);
CREATE TABLE
postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:09:22)=#  insert into test values (1,'test',now()) on conflict (id) do update set info=excluded.info,crt_time=excluded.crt_time;
INSERT 0 1
postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:09:44)=# select * from test;
+----+------+----------------------------+
| id | info |          crt_time          |
+----+------+----------------------------+
|  1 | test | 2024-04-16 14:09:44.405528 |
+----+------+----------------------------+
(1 row)

postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:09:51)=#  insert into test values (2,'hah','2024-04-16 14:01:33.640731') on conflict (id) do update set info=excluded.info,crt_time=excluded.crt_time;
INSERT 0 1
postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:10:01)=# select * from test;
+----+------+----------------------------+
| id | info |          crt_time          |
+----+------+----------------------------+
|  1 | test | 2024-04-16 14:09:44.405528 |
|  2 | hah  | 2024-04-16 14:01:33.640731 |
+----+------+----------------------------+
(2 rows)

image.png

2.模拟连续两次插入同样的主键值

可以看到,id是主键,我连续两次插入id=7,但是没有主键冲突,原本的insert变成了更新,把id=7的其他字段进行了更新。

postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:11:22)=#  insert into test values (7,'test',now()) on conflict (id) do update set info=excluded.
info,crt_time=excluded.crt_time;
INSERT 0 1
postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:11:38)=# select * from test where id=7;
+----+------+----------------------------+
| id | info |          crt_time          |
+----+------+----------------------------+
|  7 | test | 2024-04-16 14:11:38.229476 |
+----+------+----------------------------+
(1 row)

postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:11:51)=#  insert into test values (7,'ha','2024-04-16 14:15:38.229476') on conflict (id) do upda
te set info=excluded.info,crt_time=excluded.crt_time;
INSERT 0 1
postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:12:11)=# select * from test where id=7;
+----+------+----------------------------+
| id | info |          crt_time          |
+----+------+----------------------------+
|  7 | ha   | 2024-04-16 14:15:38.229476 |
+----+------+----------------------------+
(1 row)	

image.png

3.模拟一条SQL包含相同的key值

可以看到,一个SQL里插入多个行记录,并且key值相同(违反主键冲突)的时候,报了ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time。上文我们也通过代码的注释部分,知道了这种问题属于用户的责任,需要用户保障,因此这部分的内容可能需要结合业务侧进行分析,检查下业务逻辑了。

postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:10:03)=# insert into test values (3,'hah','2024-04-16 14:01:33.640731'),(3,'hah','2024-04-16 14:01:33.640731') on conflict (id) do update set info=excluded.info,crt_time=excluded.crt_time;
ERROR:  ON CONFLICT DO UPDATE command cannot affect row a second time
HINT:  Ensure that no rows proposed for insertion within the same command have duplicate constrained values.

postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:10:27)=# insert into test values (4,'hah','2024-04-16 14:01:33.640731'),(5,'hah','2024-04-16 14:
01:33.640731') on conflict (id) do update set info=excluded.info,crt_time=excluded.crt_time;
INSERT 0 2
postgres<16.1>(ConnAs[postgres]:PID[1103345] 2024-04-16/14:10:38)=# select * from test;
+----+------+----------------------------+
| id | info |          crt_time          |
+----+------+----------------------------+
|  1 | test | 2024-04-16 14:09:44.405528 |
|  2 | hah  | 2024-04-16 14:01:33.640731 |
|  4 | hah  | 2024-04-16 14:01:33.640731 |
|  5 | hah  | 2024-04-16 14:01:33.640731 |
+----+------+----------------------------+
(4 rows)

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/559431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在CentOS本地搭建DataEase数据分析服务并实现远程查看数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

信息系统项目管理师0056:数据管理(4信息系统管理—4.2管理要点—4.2.1数据管理)

点击查看专栏目录 文章目录 4.2管理要点4.2.1数据管理1.数据战略2.数据治理3.数据架构4.数据应用5.数据安全6.数据质量7.数据标准8.数据生存周期9.理论框架与成熟度4.2管理要点 信息系统管理涉及系统准备、设计、实施、运行等活动的众多方面,

基于SpringBoot的在线五子连珠的设计与实现,前端采用vue框架;后端采用SpringBoot,mybatis

介绍 基于SpringBoot的在线五子连珠的设计与实现&#xff0c;主要是设计一款五子棋游戏&#xff0c;涉及登录注册的功能&#xff0c;人机对战、联机对战和积分排行榜的功能。其中人机对战中&#xff0c;电脑采用的是采用了一种基于局面分析的评分算法来确定机器人的下一步落子…

java 红黑树

01.红黑树的定义&#xff1a; 每一个结点有五个属性&#xff1a;

书生浦语大模型实战训练营--第二期第六节--Lagent AgentLego 智能体应用搭建--homework

一、基础作业 1.完成 Lagent Web Demo 使用&#xff0c;并在作业中上传截图 根据以下命令启动成功&#xff01; 2.完成 AgentLego 直接使用部分&#xff0c;并在作业中上传截图 这是原图 使用AgentLego进行自动目标检测后&#xff0c;很明显图中的物体已经被识别出来了 二、…

ElasticSearch可视化工具:kibana + elasticsearch-head

kibana 下载 地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 下载别的版本&#xff1a;https://www.elastic.co/cn/downloads/past-releases#kibana 将Kibana安装包解压缩 进入config目录&#xff0c;在kibana.yml中添加es服务器地址。&#xff08;如果之前没…

Latex使用algoritm2e出现的错误汇总(updating)

1. return 和 end在一行 解决办法是&#xff1a;\Return{}中必须使用latex公式&#xff0c;如&#xff1a;\Return{$S_b$}

uniapp全局监听分享朋友圈或朋友

把大象装进冰箱需要几步&#xff1a; 1、创建shart.js文件 export default{data(){return {//设置默认的分享参数//如果页面不设置share&#xff0c;就触发这个默认的分享share:{title:标题,path:/pages/index/index,imageUrl:图片,desc:描述,content:内容}}},onLoad(){let ro…

Android的一些总结

先打开自定义的app显示欢迎->消失 打开桌面应用程序->在桌面应用程序中也要能一键启动打开视频播放的app 桌面应用程序广播接收者进行监听&#xff0c;然后打开服务/activity是可行的。 ########################## 日志&#xff0c;调试&#xff1a; Usb 无线 串口…

机器学习预测汽车油耗效率 MPG

流程 数据获取导入需要的包引入文件,查看内容划分训练集和测试集调用模型查看准确率 数据获取 链接&#xff1a;https://pan.baidu.com/s/1KeIJykbcVpsfEk0xjhiICA?pwd30oe 提取码&#xff1a;30oe --来自百度网盘超级会员V1的分享导入需要的包 import pandas as pd imp…

华为认证实验配置(10): 实现VLAN间通信

传统交换二层组网中&#xff0c;默认所有网络都处于同一个广播域&#xff0c;这带了诸多问题。VLAN技术的提出&#xff0c;满足了二层组网隔离广播域需求&#xff0c;使得属于不同VLAN的网络无法互访&#xff0c;但不同VLAN之间又存在着相互访问的需求 重点&#xff1a;使用路…

【人工智能】机器学习算法综述及常见算法详解

目录 推荐 1、机器学习算法简介 1.1 机器学习算法包含的两个步骤 1.2 机器学习算法的分类 2、线性回归算法 2.1 线性回归的假设是什么&#xff1f; 2.2 如何确定线性回归模型的拟合优度&#xff1f; 2.3 如何处理线性回归中的异常值&#xff1f; 3、逻辑回归算法 3.1 …

公园高速公路景区校园IP网络广播音柱SIP音柱

公园高速公路景区校园IP网络广播音柱SIP音柱 适用于学校、车站、教堂、工厂、仓库、公园停车场及露天市场高速公路等场所播放录制语音文件或背景音乐节目&#xff0c;专业一体化音箱设计&#xff0c;高强度防水设计&#xff0c;符合IP54防护等认证&#xff0c;数字化产品&…

.net6项目模板

1.集成log4net 安装依赖包&#xff1a; 安装扩展依赖即可&#xff0c;已经包含了log4net依赖&#xff1a; Microsoft.Extensions.Logging.Log4Net.AspNetCore 添加日志配置文件&#xff1a; 日志配置文件属性设置为始终复制&#xff1a; 注入服务&#xff1a; #region 注入…

Spring Boot 实现接口幂等性的 4 种方案

一、什么是幂等性 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂…

微信小程序开发之多图片上传+.NET WebAPI后端服务保存图片资源

前言&#xff1a; 最近开发的一个微信小程序项目需要做一个同时选中三张&#xff08;或者是多张&#xff09;图片一起上传到服务端&#xff0c;服务端保存图片资源并保存的功能。发现在微信小程序开发中会有很多场景会使用到多图片上传并保存到的功能&#xff0c;所以我把自己总…

高频前端面试题汇总之Vue篇

1. Vue的基本原理 当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用 Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。 每个组件实…

Stable Diffusion 模型分享:ChilloutMix(真实、亚洲面孔)chilloutmix_NiPrunedFp32Fix

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 相信近来吸引大家想一试 Stable Diffusion 图像生…

【EI会议征稿】2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024)

2024 International Conference on Advanced Mechatronic, Electrical Engineering and Automation ●会议简介 2024年先进机械电子、电气工程与自动化国际学术会议&#xff08;ICAMEEA 2024&#xff09;将汇聚全球机械电子、电气工程与自动化领域的专家学者&#xff0c;共同…

洗眼镜什么牌子的超声波清洗机好用?全网一致好评四大品牌

眼镜作为我们日常佩戴的必备单品&#xff0c;你是否真正关注过它的清洁度&#xff1f;眼镜不清洗&#xff0c;不仅影响视力&#xff0c;还可能对眼睛造成不可逆的伤害。因此&#xff0c;眼镜一定要经常清洗&#xff0c;而超声波清洗机则是你洗眼镜的最佳选择。在市面上&#xf…