PG的子查询:insert 没有就插入记录,update有则更新记录
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有则更新记录的更多相关文章
- MariaDB 连接查询与子查询(6)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- 读《程序员的SQL金典》[3]--表连接、子查询
一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...
- Oracle_SQL(5) 连接和子查询
一.连接join一般分类: inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行. left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right ...
- mysql update不支持子查询更新
先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...
- 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束
/* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...
- 在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题)
原文:在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 求一查询语句 http: ...
- SQLite进阶-14.子查询
目录 子查询 SELECT语句中的子查询 INSERT语句中的子查询 UPDATE语句中的子查询 DELETE语句中的子查询 子查询 子查询或内部查询或嵌套查询是在另一个SQLite查询内嵌入在WHE ...
- 【MYSQL】update/delete/select语句中的子查询
update或delete语句里含有子查询时,子查询里的表不能在update或是delete语句中,如含有运行时会报错:但select语句里含有子查询时,子查询里的表可以在select语句中. 如:把 ...
- mysql之子查询
所谓子查询,就是指在一个查询之中嵌套了其他的若干查询,通过子查询可以实现多表查询,该查询语句中可能包含IN,ANY,ALL和EXISTS等关键字,除此之外还可以包含比较运算符,子查询经常出现在WHER ...
- sql子查询在insert、update、delete中的应用
子查询可以应用在INSERT.UPDATE以及DELETE等语句中,合理的使用子查询将能够简化功能的实现并且极大的提高SQL语句执行的效率 用到的表: CREATE TABLE `t_readerfa ...
随机推荐
- Solution -「AGC 020F」Arcs on a Circle
\(\mathscr{Description}\) Link. 在一个周长为 \(c\) 的圆周上放置长度分别为 \(l_1,l_2,\cdots,l_n\) 的弧,每条弧的位置独立均匀随机. ...
- 使用ffmpeg去除音频静音
直接使用cmd命令ffmpeg -i input.wav -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-30dB ...
- C#调用IronOcr识别文字不理想
识别文字不理想,不知道什么原因,文字太小就几乎无法识别.... void Test() { DateTime d1 = DateTime.Now; var ocr = new IronTesserac ...
- w3cschool-HBase官方文档-3MapReduce
HBase和MapReduce 2018-03-30 13:59 更新 HBase和MapReduce Apache MapReduce 是一个用于分析大量数据的软件框架.它由 Apache Hado ...
- Object类是所有Java类的根父类
- HTB Builder walkthrough
nmap nmap -sS -A -T4 10.10.11.10 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-20 01:31 UTC Nma ...
- 变量-python
变量-python 1. 变量的定义 变量是存储数据的地方,在程序运行时,变量的值可以改变.变量的定义格式如下: 变量名 = 数据 例如: a = 10 b = "hello" c ...
- GIS数据合集:作物、植被数据下载平台整理
本文对目前主要的作物类型与产量.植被物候与指数数据产品的获取网站加以整理与介绍. 目录 4 植被农业数据 4.1 作物产量数据 4.1.1 SPAM 4.1.2 Aerial Intelligen ...
- 用python做时间序列预测二:时间序列的一般数据格式和可视化
本文将介绍如何通过python来读取.展现时间序列数据. 读取 时间序列数据一般用cvs等电子表格的形式存储,这里以cvs为例: from dateutil.parser import parse f ...
- [CF1981E] Turtle and Intersected Segments 题解
好题好题. 难点在建图,因为图的边数将会决定最小生成树的时间复杂度.我们肯定希望能够只建 \(O(n)\) 级别的边,这样时间复杂度就可以做到 \(O(n\log n)\). 观察到当 \(i,j,k ...