当前位置: 首页 > 知识库问答 >
问题:

使用PostgreSQL批量更新同一查询中的多行

张心水
2023-03-14

我想在一条语句中更新PostgreSQL和Go中的多行。有没有办法做如下事情?

UPDATE table 
SET column_a = "FINISH", 
    column_b = 1234 
WHERE id = '1',
    column_a = "UNFINISH", 
    column_b = 3124 
WHERE id = '2' 

还有有没有一个例子,如果用go语言执行?

共有3个答案

姜华翰
2023-03-14

我很喜欢使用派生表来构建它:

UPDATE t
    SET column_a = v.column_a,
        column_b = v.column_b
    FROM (VALUES (1, 'FINISH', 1234),
                 (2, 'UNFINISH', 3124)
         ) v(id, column_a, column_b)
    WHERE v.id = t.id;

这使得添加额外的值(包括< code>id和列)变得简单,而不会使查询变得复杂。它也不容易出现意外错误。

李永寿
2023-03-14

我想你想要:

update mytable
set 
    column_a = case when id = 1 then 'FINISH' else 'UNFINISHED' end,
    column_b = case when id = 1 then 1234     else 3124 end
where id in (1, 2)

理由:

>

  • where 子句仅对要更新id进行筛选,这样效率更高(前提是您在 id 上有索引),并简化了条件逻辑

    id看起来像一个数字,所以应该这样对待(即,不要用引号包围文字值)

    文字字符串必须用单引号包围-双引号代表标识符(例如列名)

  • 柯瀚玥
    2023-03-14

    在Postgres中执行此操作的最有效方法是使用UNNEST。这允许您每列传递一个参数(而不是行数x列数)。对于您的示例,如下所示:

    UPDATE table
    SET
      column_a=bulk_query.updated_column_a,
      column_b=bulk_query.updated_column_b
    FROM
      (
        SELECT * FROM UNNEST(
          ?::TEXT[],
          ?::TEXT[],
          ?::INT[]
        ) AS t(id, updated_column_a, updated_column_b)
      ) AS bulk_query
    WHERE
      users.id=bulk_query.id
    

    然后可以传递三个参数:

    [
      ["1", "2"],
      ["FINISH", "UNFINISH"],
      [1234, 3124]
    ]
    

    这种方法的优点是,无论要更新多少行,您都只需要这3个参数。

    我在这篇博文中写了更多关于这个主题的内容:https://www.atdatabases.org/blog/2022/01/21/optimizing-postgres-using-unnest#update-multiple-records-to-different-values-in-a-single-query

     类似资料:
    • 我希望在一条语句中更新PostgreSQL中的多行。有没有一种方法可以做到以下几点?

    • 问题内容: 我在这里找到了一些可以更新一个字段的东西:http : //www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different- values-and-a-single-sql- query/ 我的问题是如何更新多个字段?如: 这当然是行不通的。尝试了其他几种组合并失败了。任何的想法?谢谢! 问题答案:

    • 问题内容: 有什么方法可以简化为一个查询吗? 问题答案: 是的,您可以使用以下查询进行操作:

    • 问题内容: 我有2张桌子,如下所示: serial_table serial_key CHARACTER VARYING(20), PRIMARY KEY(id, serial_key) serial_rate: serial_key CHARACTER VARYING(20), rate NUMERIC, PRIMARY KEY(id, serial_key), FOREIGN KEY (id,

    • 问题内容: 我正在尝试通过将新记录更新或插入新的记录到 voice_user_table中 来更新数据库。该表定义如下: 这是我正在使用的查询。我实际上对所有值都使用了参数,但是出于测试目的,我将其替换为我确定应该可以使用的值。用户名 aaa@aaa.com 存在。 运行查询后,我得到的输出是: 尽管应该插入新值,但是因为该行在数据库上尚不存在。当我仅使用insert子句手动插入一行,然后执行上面

    • 我尝试通过实现以下函数,使用单个查询更新多行(约 350000): 尝试运行上述函数时,仅更新了 31 条记录。然后,我尝试使用以下函数逐行更新: 后者迄今已更新了所有记录,但速度很慢(估计将在9小时内结束)。有人知道更新多个记录的有效方法吗?