求问各位 V 友 PG 库的批量插入问题

2020-07-22 13:06:29 +08:00
 yuan434356430

oracle 迁移到 Pg 过程中,改造 merge 为 with 递归形式,但不清楚怎么改成传入 list 形式; 简化的 sql 如下

with upsert as (update xxx set state = #{state} 
where code = #{code} and number = #{number} returning *)
insert into xxx select #{id}, #{state}, #{code}, #{number}
where (select count(*) from upsert) = 0;

int merge(DTO dto);

这样可以实现单条数据的 upsert,但是对传入 List<DTO>形式毫无头绪,在此求助广大 V 友~
1074 次点击
所在节点    程序员
6 条回复
yuan434356430
2020-07-22 13:40:43 +08:00
兄弟们我自己找到解决方案了,写法是这样的~

with upsert as (update xxx set state = case when code= '1' and number = '1' then '1'
when code= '2' and number = '2' then '2'
end returning code, number returning *)
insert into xxx select '1', '1', '1', '1'
where (select count(*) from upsert where '1' = upsert.code and '1' = upsert.number) = 0
UNION ALL SELECT '2', '2', '2', '2'
where (select count(*) from upsert where '2' = upsert.code and '2' = upsert.number) = 0;
yuan434356430
2020-07-22 14:22:45 +08:00
不过还是有点缺陷,就是 case when 涉及不到的条件会置空
yuan434356430
2020-07-22 14:36:57 +08:00
加了 where 限定条件,完美
yjhatfdu2
2020-07-22 15:01:21 +08:00
pg 支持原生的 upsert,insert into tbl values(xx,xx) on conflict(some_unique_key) do update set xxx=exclude.xxx;
yuan434356430
2020-07-22 15:18:40 +08:00
@yjhatfdu2 表分区之后不支持 on conflict,哈哈哈哈哈哈哈哈哈哈哈哈
yuan434356430
2020-07-22 15:20:06 +08:00
领导教我一种方式直接用最朴素的方式,foreach 拼 sql,然后用 pipeline 提交到数据库

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692169

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX