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

标签 sql postgresql go sql-update case

我希望在一条语句中更新 PostgreSQL 和 Go 中的多行。有没有办法做类似下面的事情?

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

如果用go语言执行的话,有没有例子?

最佳答案

在 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

关于sql - 使用 PostgreSQL 批量更新同一查询中的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62888585/

相关文章:

sql - 优化 Oracle 查询

sql - 在 sql server 中搜索 LEN() 函数的替代函数以进行优化

php - 为什么 pg_query_params 将 boolean 值读取为字符串?

go - 模拟 Go 数据库 SDK

date - 解析 UTC 日期字符串并转换为不同的格式

xml - 是否可以流解析XML父元素而不解析其子元素?

sql - Redshift FULL OUTER JOIN 不输出 NULL

sql - 如何获取 ROW_NUMBER() 的替代值?

postgresql - 将 Oracle 存储过程转换为 PostgreSQL

postgresql - PostgreSQL 是否存在于 OS X Mavericks 上?