Sql 在单个查询中更新多行上的不同列
假设我们有下表:Sql 在单个查询中更新多行上的不同列,sql,postgresql,Sql,Postgresql,假设我们有下表: id | col_a | col_b | col_c 1 | abc | null | qwqw 2 | null | null | null 3 | null | ijij | cba 我们希望进行以下更新: 第1行:设置列a=cba 第2行:设置列b=uiui,列c=zxzx 第3行:设置col_b=null 首先,可以在一个查询中完成吗 如果没有,最好的选择是什么 每行一个查询,如更新表集。。。其中id=1; 获取行,用新值替换旧值,并对表值进
id | col_a | col_b | col_c
1 | abc | null | qwqw
2 | null | null | null
3 | null | ijij | cba
我们希望进行以下更新:
第1行:设置列a=cba
第2行:设置列b=uiui,列c=zxzx
第3行:设置col_b=null
首先,可以在一个查询中完成吗
如果没有,最好的选择是什么
每行一个查询,如更新表集。。。其中id=1;
获取行,用新值替换旧值,并对表值进行大量插入。。。在冲突id上,更新集合col_a=EXCLUDED.col_a,col_b=EXCLUDED.col_b,col_c=EXCLUDED.col_c;
还有别的吗?
最简单的方法是三个更新: 您可以将它们包装在事务中,以便它们同时生效。假设您在id上有一个索引,这应该有很好的性能 您可以使用条件逻辑将它们放入单个语句中:
update t
set col_a = (case when id = 1 then cba else col_a end),
col_b = (case when id = 2 then uiui
when id = 3 then null
else col_b
end),
col_c = (case when id = 2 then zxzx else col_c end)
where id in (1, 2, 3);
我认为三个单独的语句更清晰,更不容易出错。谢谢您的一个语句。这就是我要找的。您认为除了3个单独的查询之外,它还有什么性能优势吗?在这里,我问了我的问题,只做了3次更新,使问题变得简单,但在实际情况中,我会有更多的更新,而且非常频繁,因此我正在寻找任何可能的性能改进。@leyou。如果where条件使用索引,则单个事务中的单独更新应提供合理的性能。关于冲突的方法很聪明,也应该有效。如果要更新表中的大部分行,那么截断和重新插入可能是最快的方法。我在笔记本电脑上模拟了10000次随机行更新,进行了一些快速测试。使用每行一次查询更新大约需要12秒。使用select+insert处理冲突大约需要6秒钟。使用一条语句,大约需要5秒钟。@leyou。当您每行执行一个查询时,是使用一个事务进行三次更新,还是每次更新使用一个单独的事务?糟糕,我没有。用一个事务进行三次更新,现在每次更新一次查询大约需要8秒。以下是我用于执行测试的代码:
update t
set col_a = (case when id = 1 then cba else col_a end),
col_b = (case when id = 2 then uiui
when id = 3 then null
else col_b
end),
col_c = (case when id = 2 then zxzx else col_c end)
where id in (1, 2, 3);