我的编程空间,编程开发者的网络收藏夹
学习永远不晚

postgresql无则插入,有则更新问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

postgresql无则插入,有则更新问题

准备工作

我们只需要准备一张表

在这里插入图片描述

upsert是一个组合词,即当往表中插入记录,如果该记录已存在则更新,否则插入新记录。

postgresql 9.5版本之前实现upsert功能

语法

postgresql 9.5版本之前想实现upsert功能可以使用with语法来实现。

实例

SQL如下

WITH UPSERT
         AS ( UPDATE org SET org_name = '复仇者联盟2', modify_time = now() WHERE org_id = 2 RETURNING *)
INSERT
INTO org (org_id, org_no, org_name)
SELECT 2,
       '002',
       '复仇者联盟'
WHERE NOT EXISTS(SELECT 1 FROM upsert WHERE org_id = 2);

第一次执行SQL,表中没有org_id为2的数据,则插入一条新数据。

在这里插入图片描述

执行成功了,刷新一下表,可以看到插入了一条新数据。

在这里插入图片描述

再次执行SQL,这时表中已经有一条为org_id为2的数据了,那么则更新数据。

在这里插入图片描述

刷新表,可以看到更新了org_name和modify_time字段。

在这里插入图片描述

嘚吧嘚(SQL语法简解)

那么是如何做到呢?

  • 首先执行update语句,如果找到满足条件的数据就更新,并把该数据存放到upsert中,在执行insert时就不满足条件了;
  • 如果找不到满足条件的数据,upsert中就是空的,在执行insert语句时就满足条件了。二者是互斥的。

postgresql 9.5版本之后实现upsert功能

语法

postgresql 9.5版本就可以使用INSERT ON CONFLICT语句了,语法如下:

insert into table_name(column_list) 
values(value_list)
on conflict target action;

实例

SQL如下:

insert into org(org_id, org_no, org_name)
values (3, '003', '银河护卫队')
on conflict(org_id) do update set org_name='银河护卫队2',
                                  modify_time=now();

第一次执行SQL,表中没有org_id为3的数据,则插入一条新数据。

在这里插入图片描述

执行成功了,刷新一下表,可以看到插入了一条新数据。

在这里插入图片描述

第二次执行SQL,这时表中已经有一条为org_id为3的数据了,那么则更新数据。

在这里插入图片描述

可以看到更新了org_name和modify_time字段。

在这里插入图片描述

嘚吧嘚(SQL语法简解)

其实大体思路和之前还是一样,就是9.5版本有了INSERT ON CONFLICT语句之后,使得书写SQL更加简单了,那就简单解释一下SQL语法中的两个名词吧。

  • target可以理解为目标或者限制条件,一般是某个字段名。
  • action是要做的具体操作,比如update、delete、do nothing等。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

postgresql无则插入,有则更新问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

postgresql无则插入,有则更新问题

目录准备工作PostgreSQL 9.5版本之前实现upsert功能postgresql 9.5版本之后实现upsert功能总结准备工作我们只需要准备一张表javascriptupsert是一个python组合词,即当往表中插入记录,如果
2023-04-06

MySql 如何实现无则插入有则更新

摘要 某些场景会有这样的需求:无记录则插入,有记录则更新。例如:新增用户,以身份证号码作为唯一身份标识,插入时若先查询是否存在记录再决定插入还是更新,在高并发情况下必然存在问题。本文提供三种解决方案。 方案一 加锁 无论通过synchron
2022-05-27

MySQL之存在则更新,否则就插入数据

MySQLINSERT...ONDUPLICATEKEYUPDATE语法可实现存在则更新,否则就插入数据功能。它用于在主键或唯一索引冲突时执行更新操作。该语句能避免数据重复,轻松更新记录,且操作具有原子性。使用时需注意主键索引和列匹配,并考虑自增列更新情况。MySQL还提供其他选项如REPLACEINTO和UPSERT来处理此类场景。
MySQL之存在则更新,否则就插入数据
2024-04-02

记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?

开心一刻  今天我爸、我、我女儿一起吃饭,我们每人一个鸡腿  女儿问道:爸爸,你吃鸡腿吗  我以为她要把她的鸡腿给我吃,倍感欣慰地说道:我不吃,宝贝  女儿一把抓起我的鸡腿放进了她爷爷的碗里,说道:不吃给爷爷吃  我没想到她会来这一出,我从我爸碗里夹回我的鸡腿
记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?
2017-10-05

深入解析Centos /boot过小无法更新内核问题

Centos7默认安装时,/boot目录设置只有150M左右,这样编译几个版本的内核/boot空间就不够用了。报错大致如下:Disk RequirementsYvAWDwTi: At least 3MB more space needed
2022-06-04

MacOS 中如何干净卸载 IDEA(否则安装新版IDEA可能会有问题)

背景 本文说的是macos的IDEA 如果你安装新版 idea,新版和旧版如果有较大的版本差异则好像是不能直接通过 idea 里自身的 “check updates” 来升级,那就得重新安装。 重新安装经常会遇到安装后的idea打不开,这就
2023-08-17

element必填校验输入空格问题修改正则表达式、请求拦截器实现所有输入框去除首尾空格(推荐)

本文详细介绍了解决Element必填校验输入空格问题的方法,包括:修改正则表达式:匹配一个或多个空白字符,不匹配空字符串。请求拦截器:集中处理所有输入框首尾空格,避免在每个表单验证器中重复代码。建议使用请求拦截器,因为它可以统一处理,避免遗漏字段。注意事项包括不会影响非表单请求、确保拦截器优先级,以及只拦截表单提交请求。
element必填校验输入空格问题修改正则表达式、请求拦截器实现所有输入框去除首尾空格(推荐)
2024-04-02

编程热搜

目录