insert into t --进行插入
values(1,'name')
ON CONFLICT(id) --如果id这个键存在
do update set --更新以下字段
name=EXCLUDED.name ; insert into t (a1,b1,c1)
select a2,b2,c2
from t2
on conflict(a1)
do update set
(b1,c1) = (1,2)

conflict里的字段必须为主键或者唯一索引,可以多个字段作为唯一索引,在数据库设置唯一,不然会报

"there is no unique or exclusion constraint matching the ON CONFLICT specification"错误

批量查询插入的时候想到了update时再按上面selete查询一遍应该就能自动全插进去了吧,然而现实总是残酷的

    insert into t (a1,b1,c1)
select a2,b2,c2
from t2
on conflict(a1) do update set
(b1,c1)= (select a2,b2,c2 from t2)

报错:"more than one row returned by a subquery used as an expression"

这样的查询 do update set只能设置一条数据

插入和更新并不是批量数据一一对应操作的 而是批量insert然后再判断是否更新 所以下面只能写死一条数据 多了就报错..遂百度

发现pgsql在这种情况下会提供一个EXCLUDED临时表把之前插入的值储存起来,然后就可以

    insert into t (a1,b1,c1)--进行插入操作
select a2,b2,c2
from t2
on conflict(a1) --如果存在a1
do update set --进行下面字段更新
(b1,c1) = (EXCLUDED.b1,EXCLUDED.c1)

这样就能实现批量查询插入或更新了

INSERT INTO "DeptApportionParams"
(
"HD_No",
"HD_Name",
"HD_Type",
"DAP_Year",
"DAP_Month"
) (SELECT
"HD_No",
"HD_Name",
"HD_Type",
2020,
2
FROM "Hosp_Dept" WHERE "HD_No"='235060570540347400' OR "HD_No"='235060570540347393' --"HD_No"='235060570540347400' --OR "HD_No"='235060570540347393' )
ON conflict ON CONSTRAINT "pr_DAP_Key" DO UPDATE SET
("HD_No","HD_Name","HD_Type") =(EXCLUDED."HD_No",EXCLUDED."HD_Name",EXCLUDED."HD_Type")
where
  "HD_No" is DISTINCT FROM EXCLUDED."HD_No" OR
  "HD_Name" is DISTINCT FROM EXCLUDED."HD_Name" OR
  "HD_Type" is DISTINCT FROM EXCLUDED."HD_Type"

感谢 :

PgSQL upsert批量查询插入或更新(insert select/on conflict do update踩坑记录)

如果希望不同就更新怎么处理?

is DISTINCT FROM功能描述
A和B的数据类型、值不完全相同返回 true
A和B的数据类型、值完全相同返回 false
将空值视为相同。

PG的子查询:insert 没有就插入记录,update有则更新记录的更多相关文章

  1. MariaDB 连接查询与子查询(6)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  2. 读《程序员的SQL金典》[3]--表连接、子查询

    一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...

  3. Oracle_SQL(5) 连接和子查询

    一.连接join一般分类: inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行. left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right ...

  4. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

  5. 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束

    /* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...

  6. 在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题)

    原文:在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 求一查询语句 http: ...

  7. SQLite进阶-14.子查询

    目录 子查询 SELECT语句中的子查询 INSERT语句中的子查询 UPDATE语句中的子查询 DELETE语句中的子查询 子查询 子查询或内部查询或嵌套查询是在另一个SQLite查询内嵌入在WHE ...

  8. 【MYSQL】update/delete/select语句中的子查询

    update或delete语句里含有子查询时,子查询里的表不能在update或是delete语句中,如含有运行时会报错:但select语句里含有子查询时,子查询里的表可以在select语句中. 如:把 ...

  9. mysql之子查询

    所谓子查询,就是指在一个查询之中嵌套了其他的若干查询,通过子查询可以实现多表查询,该查询语句中可能包含IN,ANY,ALL和EXISTS等关键字,除此之外还可以包含比较运算符,子查询经常出现在WHER ...

  10. sql子查询在insert、update、delete中的应用

    子查询可以应用在INSERT.UPDATE以及DELETE等语句中,合理的使用子查询将能够简化功能的实现并且极大的提高SQL语句执行的效率 用到的表: CREATE TABLE `t_readerfa ...

随机推荐

  1. flutter 的一些概念三

    本文同步发布于公众号:stringwu的互联网杂谈:flutter 的一些概念三 1 Stream 与 Future的关系 Stream 和 Future 都是 Flutter 中常用的异步编程模型, ...

  2. C# Unit test TestInitialize\TestCleanp

    C# TestInitialize\TestCleanp ※※冰馨※※ 2020-12-15 09:19:37 75 收藏分类专栏: VS版权 VS专栏收录该内容197 篇文章1 订阅订阅专栏带有[C ...

  3. 免费-高清免费视频录像软件OBS

    OBS studio 是免费开源的. https://obsproject.com/download 中文绿色版: http://www.xitongzhijia.net/soft/151705.ht ...

  4. 部署简单的单节点k8s

    1.Kubernetes简介 Kubernetes,简称K8s,是用8代替名字中间的8个字符"ubernete"而成的缩写.Kubernetes是Google开源的一个容器编排引擎 ...

  5. C++:Eigen库

    了解C++的Eigen库,主要内容来自:https://blog.csdn.net/hongge_smile/article/details/107296658 ,并加入自己的笔记. 介绍 Eigen ...

  6. A note on the calculation of some functions in finite fields: Tricks of the Trade解读

    本节对该paper进行解读,记录笔记. 经常见到的是在素域\(F_p\)上计算的,尤其是双线性对出现后,在扩域\(F_{p^m}\)上计效率就需要优化了.该论文主要总结了一些在有限域上进行某些计算(求 ...

  7. PKUWC2025 游记

    哈哈哈哈哈,我糖完了,哈哈哈哈哈. Day \(-998244353\) 被波波抓到机房充军集训去了,听到了很多新奇的算法,然后拼尽全力仍难以 \(AC\)--然后被各种巨佬疯狂单调队列. Day \ ...

  8. signature hdr data: BAD (signature 头部数据:不当)

    这应该属于 rpm 4.12-4.13 早期版本的BUG,不止CentOS8会这样 解决方式也很干脆,就是手动更新rpm版本,跳过存在bug的版本,然后yum.rpm就都会正常,就可以自动更新最新的软 ...

  9. Thymeleaf 嵌套循环

    <label th:each="role:${roles}" class="check-box"> <input th:each=" ...

  10. PowerShell实现读取照片并做灰度处理

    Powershell一直是我的学习目标.做一个小例子.PowerShell实现读取照片并做灰度处理.还想要保存这张灰度照片并直接打开查看. 分析需求: [读取照片]  需要借助.net framewo ...