Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在单个查询中更新多行上的不同列_Sql_Postgresql - Fatal编程技术网

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);