POSTGRESQL中ON CONFLICT的使用

        在 PostgreSQL 中,ON CONFLICT 子句是用在 INSERT 语句中的一种机制,它可以帮助你处理当插入操作遇到违反唯一性约束(比如唯一索引或主键约束)时的情况。使用 ON CONFLICT 子句,你可以指定当违反唯一性约束时应该采取的操作,比如忽略这个插入,或者更新已经存在的行。
        ON CONFLICT (sample_id_lims) DO UPDATE 是指当你在插入数据时,如果 sample_id_lims 字段的值导致了唯一性约束的冲突,那么不是放弃这次插入,而是更新已经存在的那一行数据。
这里有一个具体的例子:
假设你有一个名为 samples 的表,它有一个名为 sample_id_lims 的字段,该字段上有一个唯一索引。现在,你想插入一个新的样本数据,但如果 sample_id_lims 的值已经存在,你希望更新这条记录的其他字段而不是放弃插入。

INSERT INTO samples (sample_id_lims, data_field1, data_field2)
VALUES ('123', 'New Data 1', 'New Data 2')
ON CONFLICT (sample_id_lims) DO UPDATE
SET data_field1 = EXCLUDED.data_field1,data_field2 = EXCLUDED.data_field2;

        在这个例子中,如果 sample_id_lims 为 '123' 的记录已经存在,那么 ON CONFLICT 子句会触发,并执行 DO UPDATE 操作。SET 子句用于更新冲突行的 data_field1 和 data_field2 字段。关键字 EXCLUDED 用来引用那些原本尝试插入但发生冲突的值。
通过使用 ON CONFLICT 子句,你可以确保表中的数据保持唯一性,同时仍然可以通过更新操作来应对重复的插入尝试。

ON CONFLICT 子句在 PostgreSQL 中的使用不仅限于简单的 UPDATE 操作。这里有一些扩展用法:

1、指定唯一约束名称:
如果表中有多个唯一约束,你可以通过唯一约束的名称指定应对哪个约束的冲突。
 

INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT ON CONSTRAINT constraint_name
DO NOTHING; -- 或者 DO UPDATE ...

2、条件更新:
在执行 UPDATE 操作时,可以加入 WHERE 子句来设置条件,仅在满足某些条件时才更新。

INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE
SET column2 = EXCLUDED.column2
WHERE table_name.column3 > 10;


3、使用 DO NOTHING:
如果你不想在发生冲突时执行任何操作,可以使用 DO NOTHING。这样,如果插入的数据违反了唯一性约束,PostgreSQL 会忽略这个插入,并且不会报错。

INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1) DO NOTHING;

4、返回插入或更新后的行:
通过 RETURNING 子句,你可以在 INSERT 操作完成后返回插入或更新的行的信息。

INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE
SET column2 = EXCLUDED.column2
RETURNING *;


5、使用 WHERE 子句过滤冲突的行:
你可以在 ON CONFLICT 子句中使用 WHERE 来过滤哪些冲突行应该被更新。

INSERT INTO table_name (column1, column2, status) VALUES (value1, value2, 'pending')
ON CONFLICT (column1) WHERE (table_name.status = 'active') DO UPDATE
SET column2 = EXCLUDED.column2;

上面的例子中,只有当冲突行的 status 字段为 'active' 时,才会执行 UPDATE 操作。
使用 ON CONFLICT 子句可以帮助你以一种优雅的方式处理可能的数据插入冲突,确保数据的完整性,同时还能灵活地进行各种条件处理。
 

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

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

相关文章

正则表达式、文件访问(Python实现)

一、主要目的: 1.了解正则表达式的基本概念和处理过程。 2.掌握使用正则表达式模块 Re 进行字符串处理的方法。 3.了解文件的基本概念和类型。 4.掌握在 Python 中访问文本文件的方法和步骤。 5.熟悉在 Python 中访问二进制文件的方法和步骤。 二、主要内容和结…

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提:电脑已安装Mysql服务; Visual Studio 安装Mysql依赖库: 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索, 安装Mysql.Data (Oracle); (安装成功后&…

常用的网站

PIXEL MOTION 注册-YesPMP平台 模型下载 - Ourblender - 专业的三维素材库 Vega AI 创作平台 夏沫的AI小站 Tripo AI B站视频下载工具 | 极简纯净

【vba】获取所在单元格,将所有sheet对应的单元格的值相加,并输入该单元格

统一计算当前单元格的所有sheet相加的值,因为导出每堂课的点名名单,对每堂课被点名的学生的分数进行一个求和,两种方式单个、多个。 单个单元格处理 Sub SumValuesAcrossSheets()Dim currentCell As RangeDim total As DoubleDim ws As Work…

视频监控录像服务器(中心录像服务器)功能详细介绍

目 录 一、概述 (一)定义 (二)视频监控中心录像服务器 二、存储策略服务 (一)存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数…

js_BOMDomAjax

总结 讲解自定义对象 在ES5中没有像Java中一样专门的class关键字定义类(ES6中可以用class定义类),所以在ES5中创建类其实和创建函数是一样的语法: function 对象名/类名/方法名(){ }一种语法代表了多重含义,在JavaScript中若想…

rime中州韵小狼毫 敏感词脱敏滤镜

快速录入,是任何一个输入法,以及输入人员(无论是否专业)的追求目标之一。现实中,由于各种输入法在录入文本时,都无法完全避免重码的问题,所以在输入过程中都或多或少的需要进行选字/选词操作。这…

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中,本地环境(dev)和开发环境(feature)会共同使用相同的中间件(本篇拿Redis举例),对于不同环境中的,图片、视频、语音等资源类型的预览地址url,需要配…

【C#】使用 LINQ 中的 Skip() 和 Take()进行分页,为什么要分页,分页作用是什么

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是是《C#》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

Java gson反序列化时,Json字符串中含有浮点类型(0.000001)时,在反序列化转换成Map时,会变成科学记数法

1、背景 已运行的大型项目中,字符串转Map使用Gson工具类进行转换,不敢贸然使用其它工具类(如FastJson),这是前提。 如果你是学习或者小型项目,Gson使用出现浮点转换科学记数法的问题,可以换成F…

mysql定时备份shell脚本和还原

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言数据库备份分类mysqldump命令备份计划1.每日备份,保留30天备份文件2.每月1号备份,保留12个月备份文件 定时调度还原总结 前言 数据库备…

(实战)静默dbca安装创建数据库 --参数说明+举例

--静默安装创建pdb数据库 dbca help dbca -silent help dbca -silent -createDatabase help --实测语句: 1.pdb dbca -silent -createDatabase -templateName General_Purpose.dbc \ -responseFile NO_VALUE \ -gdbname orcl -sid orcl \ -createAsContainerDatabase true \ -…

springboot(ssm宠物商城网站 在线电商系统 Java系统

springboot(ssm宠物商城网站 在线电商系统 Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0) 数据库…

创建并美化Github主页(内含组件)

目录 1、创建仓库 2、美化 1、包含多种 2、活动统计图 3、资料奖杯 4、文字的打字特效 5、中文网站卡片 6、贪吃蛇贡献图 7、可参考的页面 最近有想要写开源的打算了,计划了好久好久好久,不知道写啥(目前仍然不知道)…… 俗话说人活一张脸&#xff0…

Linux安装RabbitMq明白纸(无图)

Linux安装RabbitMq步骤 安装环境Erlang和RabbitMQ版本对照安装包下载地址登录Linux服务器创建安装目录将之前下载的两个rpm文件上传到这个目录下,并解压安装Erlang安装完成后,查看Erlang版本安装socat(RabbitMq安装需要这个)解压并…

一台Linux服务jdk1.6 与 jdk1.8 并存,tomcat6+tomcat8 并存

Linux jdk1.6,1.8 tomcat6 tomcat8 并存 需求场景: 有一个项目 原来是 jdk1.6tomcat6 部署的,现在需要进行项目架构升级 项目需要适配jdk1.8 然后用 jdk.8 tomcat 8进行部署,然后下架 jdk1.6 的linux服务 现在有一台 jdk.8 tomcat 8的linu…

Qt During startup program exited with code 0xc0000135

网上试了好多办法没有用,可以试试在pro目录下加入如图所示的.dll 可以下个everything搜索整个电脑查看是否有上述dll,如果没有也可以网上下载或者点击连接

Mybatis xml中排序(order by)条件用#{}查询失败

问题描述: 处理简单分页时,发现从外部传入的排序条件无法生效,但程序无报错,正常返回列表,只是排序条件不对; 原因: #{}表示一个占位符,当#{}传入的数据是一个字符串时,会…

服务器感染了.pings勒索病毒,如何确保数据文件完整恢复?

导言: 随着科技的不断进步,网络犯罪也在不断演变。其中之一的.pings勒索病毒是一种危险的恶意软件,它能够加密用户的数据文件,并要求支付赎金以解密这些文件。在本文中,91数据恢复将介绍.pings勒索病毒,以…

uniapp使用vue3语法利用uni.navigateTo跳转和接收参数

官网利用vue3语法写uni.navigateTo跳转接参可能出现接收参数有问题的情况 ,获取上一个页面数据需要进行调整。 uni官网:uni.navigateTo(OBJECT) | uni-app官网 一、传参给下一个页面 uni.navigateTo({url:/pages/index/inviteOrder,//跳转的页面succes…