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. Solution Set -「AGC 007~009」C~F

    目录 「AGC 007C」Pushing Balls 「AGC 007D」Shik and Game 「AGC 007E」Shik and Travel ^ 「AGC 007F」Shik and Co ...

  2. 如何发现漏洞之我的多功能武器BurpSuite与全能插件

    知识点 1.插件类-武装BurpSuite-漏洞检测&分析辅助 2.插件类-武装谷歌浏览器-信息收集&情报辅助 一.演示案例-插件类-武装BurpSuite-漏洞检测&分析辅助 ...

  3. springboot整合security实现权限控制

    1.建表,五张表,如下:1.1.用户表CREATE TABLE `t_sys_user` ( `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ...

  4. biancheng-MongoDB教程

    目录http://c.biancheng.net/mongodb2/ 1NoSQL是什么2MongoDB是什么3Windows安装MongoDB4Linux安装MongoDB5MacOS安装Mongo ...

  5. 如何在 ASP.NET Core 中实现速率限制?

    在 ASP.NET Core 中实现速率限制(Rate Limiting)中间件可以帮助你控制客户端对 API 的请求频率,防止滥用和过载.速率限制通常用于保护服务器资源,确保服务的稳定性和可用性. ...

  6. 深入了解SSH

    学习:深入了解SSH ssh 有商业和开源版本,其中openssh是开源中最流行的. ssh历史 1995 年 7 月, 芬兰学者Tatu Ylonen 以免费软件的形式将一套保护信息传输的程序(也就 ...

  7. 从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群

    从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群 AlwaysOn集群是SQL Server里唯一推荐的高可用性架构, 在AlwaysOn高可用性架构中,有非 ...

  8. Luogu P4933 大师 题解 [ 绿 ] [ 线性 dp ] [ dp 细节处理 ] [ 限制转移条件优化 ]

    依据值域的 \(O(n^2)\) 做法 这种做法只适用于这种值域小的题,下一种做法才是求等差数列的通解. 我们定义 \(f[i][j]\) 表示以 \(h_i\) 为最后一个数,公差为 \(j\) 的 ...

  9. [ABC227E] Swap 题解

    考试一道题题解. 30pts:枚举所有串,\(check\) 是否可行. 60pts:做 \(bfs\),暴力推演变化过程,用 \(map\) 去重,时间复杂度 \(O(nC_{n}^{n/3}C_{ ...

  10. 开启 Typecho 的 gzip 压缩

    简介 GZip压缩,是一种网站速度优化技术,也是一把SEO优化利器,许多网站都采用了这种技术,以达到提升网页打开速度.缩短网页打开时间的目的. 网站采用Gzip压缩,还有一个好处,就是让你少了一份流量 ...