我正在尝试进行大规模 PostgreSQL 更新,但无法找出正确的方法

Posted

技术标签:

【中文标题】我正在尝试进行大规模 PostgreSQL 更新,但无法找出正确的方法【英文标题】:I am trying to do a massive PostgreSQL update and can not figure out the proper way 【发布时间】:2013-12-10 15:54:56 【问题描述】:
    UPDATE member_copy
SET locked_date = CURRENT_DATE,
 notes = (
    SELECT
        notes
    FROM
        member_copy
    WHERE
        ID = 17579
) || ' CLOSED'
WHERE
    ID = 17579

我正在尝试在 PostgreSQL 8.1.23 中像这样运行数据库更新。我需要同时使用大约 800 个 id 进行此更新。任何帮助将不胜感激。

【问题讨论】:

您应该现在计划升级到受支持的版本。 8.1 已经停止维护多年了。 我愿意,但这不是我的决定。 当然,您至少可以指出不这样做可能引起的安全问题。或许我享有特权,但我还没有遇到一位能将这类问题扫得一干二净的经理。 【参考方案1】:

您可以在很大程度上简化为:

UPDATE member_copy
SET locked_date = CURRENT_DATE
   ,notes = COALESCE(notes || ' ', '') || 'CLOSED'
WHERE id IN (17579, 12345, ...); --- 800 IDs

COALESCE 用于捕获notes IS NULL 的情况。 甚至应该在古代 Postgres 8.1 中工作。但是您确实必须升级到当前版本。

在现代 Postgres 中,我会使用 ID 临时表(或子选择)并在 UPDATE 中加入它。

【讨论】:

谢谢!这对我来说非常有效。不幸的是,升级不是我的任务,但计划很快就会有一个新站点。

以上是关于我正在尝试进行大规模 PostgreSQL 更新,但无法找出正确的方法的主要内容,如果未能解决你的问题,请参考以下文章

在同一查询中选择和更新 PostgreSQL 以进行优化

如何在 PostgreSQL 中找出碎片索引并对其进行碎片整理?

PostgreSQL 上的 EF Core 批量删除

如何对 postgresql 中具有联合的查询进行更新?

在 JDBC / PostgreSQL 中使用 SQL 数组类型更新结果集

更新语句语法 (PostgreSQL-Redshift)