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 ...
随机推荐
- Java常用的并发类-总结列表
一.java集合框架概述 java集合可分为Collection和Map两种体系,其中: 1.Collection接口:单列数据,定义了存取一组对象的方法的集合: List:元素有序.可重复的集合 S ...
- weixueyuan-Nginx HTTP模块3
https://www.weixueyuan.net/nginx/http/ Nginx镜像模块:ngx_http_mirror_module Nginx 中镜像模块的功能是将用户的访问请求镜像复制到 ...
- 第六章 (Nginx+Lua)Web开发实战HTTP服务
此处我说的HTTP服务主要指如访问京东网站时我们看到的热门搜索.用户登录.实时价格.实时库存.服务支持.广告语等这种非Web页面,而是在Web页面中异步加载的相关数据.这些服务有个特点即访问量巨大.逻 ...
- DC/DC layout建议
DCDC电路的重要性不言而喻,不合理的PCB Layout会造成芯片性能变差,甚至损坏芯片.如:线性度下降.带载能力下降.工作不稳定.EMI辐射增加.输出噪声增加等. 环路面积最小原则 DC/DC电路 ...
- Q:Linux符号连接的层数过多
创建符号链接的时候源文件一定要使用绝对路径,尤其是链接不在同一目录时候,用相对路径会出现这种bug,具体是红色闪烁状态.:正常应该是青绿色 例如: 安装zabbix_agent遇到的问题,在root ...
- 流程控制之do while循环
语法 do { //代码语句}while(布尔表达式): 与while的区别 while是先判断再执行,do while是先执行再判断 循环体至少会被执行一次 实例1: package com. ...
- Microsoft.Expression.Drawing文件安装
使用Blend的绘制功能,需要引用 Microsoft.Expression.Drawing 库文件, xmlns:ed="http://schemas.microsoft.com/expr ...
- 【软件开发】Git 概念与常用命令
[软件开发]Git 概念与常用命令 Git 概念 存储方式 Git 是分布式存储,每一个 clone 下来的仓库都可以看成独立的个体,只是 Git 有提供同步功能,因此 Git 支持离线使用,因为本质 ...
- Deepseek学习随笔(8)--- 清华大学发布Deepseek从入门到精通(附网盘链接)
文档简介:AI时代的新工具手册 清华大学新闻与传播学院联合元宇宙文化实验室发布的<DeepSeek从入门到精通>,是一份系统化.实战性极强的AI工具学习指南.文档聚焦国产开源通用人工智能工 ...
- Typecho博客添加音乐外链支持Https
首先选个音质和音乐比较全面的音乐站,这里选了网易云音乐,自己手机用的网易云音乐app,存了好多歌单,所以就选他了,但是想获取音乐文件链接,得去这儿:季春二九音乐站 其实很简单,参考下面. 1.先找到网 ...