如何批量更新 postgres 中的单个列 5500 万条记录

2023-11-24

我想更新 postgres 表的一列。记录大约有 5500 万条,因此我们需要批量更新 10000 条记录。 注意:我们要更新所有行。但我们不想锁定我们的桌子。

我正在尝试以下查询 -

Update account set name = Some name where id between 1 and 10000

我们如何为每 10000 条记录更新创建一个循环?

任何建议和帮助将不胜感激。

PostgreSQL 10.5


我宁愿尝试将更新行分成小批量,例如,而不是一次提交所有更改(或其他答案中建议的 5500 万次)。按照您的建议,有 10k 条记录。在 PL/pgSQL 中,可以使用关键字以给定步骤迭代集合BY。所以你可以在一个中进行批量更新anonymous code block像这样:

PostgreSQL 11+

DO $$ 
DECLARE 
  page int := 10000;
  min_id bigint; max_id bigint;
BEGIN
  SELECT max(id),min(id) INTO max_id,min_id FROM account;
  FOR j IN min_id..max_id BY page LOOP 
    UPDATE account SET name = 'your magic goes here'
    WHERE id >= j AND id < j+page;
    COMMIT;            
  END LOOP;
END; $$;
  • 您可能想要调整WHERE以避免不必要的重叠。

Testing

具有 1051 行且具有连续 ID 的数据样本:

CREATE TABLE account (id int, name text);
INSERT INTO account VALUES(generate_series(0,1050),'untouched record..');

执行匿名代码块...

DO $$ 
DECLARE 
  page int := 100;
  min_id bigint; max_id bigint;
BEGIN
  SELECT max(id),min(id) INTO max_id,min_id FROM account;
  FOR j IN min_id..max_id BY page LOOP 
    UPDATE account SET name = now() ||' -> UPDATED ' || j  || ' to ' || j+page
    WHERE id >= j AND id < j+page;
    RAISE INFO 'committing data from % to % at %', j,j+page,now();
    COMMIT;            
  END LOOP;
END; $$;
    
INFO:  committing data from 0 to 100 at 2021-04-14 17:35:42.059025+02
INFO:  committing data from 100 to 200 at 2021-04-14 17:35:42.070274+02
INFO:  committing data from 200 to 300 at 2021-04-14 17:35:42.07806+02
INFO:  committing data from 300 to 400 at 2021-04-14 17:35:42.087201+02
INFO:  committing data from 400 to 500 at 2021-04-14 17:35:42.096548+02
INFO:  committing data from 500 to 600 at 2021-04-14 17:35:42.105876+02
INFO:  committing data from 600 to 700 at 2021-04-14 17:35:42.114514+02
INFO:  committing data from 700 to 800 at 2021-04-14 17:35:42.121946+02
INFO:  committing data from 800 to 900 at 2021-04-14 17:35:42.12897+02
INFO:  committing data from 900 to 1000 at 2021-04-14 17:35:42.134388+02
INFO:  committing data from 1000 to 1100 at 2021-04-14 17:35:42.13951+02

..您可以批量更新行。为了使我的观点更清楚,以下查询计算按更新时间分组的记录数:

SELECT DISTINCT ON (name) name, count(id)
FROM account 
GROUP BY name ORDER BY name;

                         name                         | count 
------------------------------------------------------+-------
 2021-04-14 17:35:42.059025+02 -> UPDATED 0 to 100    |   100
 2021-04-14 17:35:42.070274+02 -> UPDATED 100 to 200  |   100
 2021-04-14 17:35:42.07806+02 -> UPDATED 200 to 300   |   100
 2021-04-14 17:35:42.087201+02 -> UPDATED 300 to 400  |   100
 2021-04-14 17:35:42.096548+02 -> UPDATED 400 to 500  |   100
 2021-04-14 17:35:42.105876+02 -> UPDATED 500 to 600  |   100
 2021-04-14 17:35:42.114514+02 -> UPDATED 600 to 700  |   100
 2021-04-14 17:35:42.121946+02 -> UPDATED 700 to 800  |   100
 2021-04-14 17:35:42.12897+02 -> UPDATED 800 to 900   |   100
 2021-04-14 17:35:42.134388+02 -> UPDATED 900 to 1000 |   100
 2021-04-14 17:35:42.13951+02 -> UPDATED 1000 to 1100 |    51

Demo: db<>fiddle

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何批量更新 postgres 中的单个列 5500 万条记录 的相关文章

  • play20 ebean 生成的 sql 在 postgresql 上抛出语法错误

    我正在尝试使用 postgresql 来启动我的 play20 应用程序 以便我可以使用并稍后部署到 Heroku 我跟着这个answer https stackoverflow com questions 12195568 errors
  • 基于列顺序的查询速度

    数据库中列类型的顺序对查询时间有影响吗 例如 具有混合排序 INT TEXT VARCHAR INT TEXT 的表的查询速度是否会比具有连续类型 INT INT VARCHAR TEXT TEXT 的表慢 答案是肯定的 这确实很重要 而且
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • 如何在SQL Server数据库表列中存储图像[重复]

    这个问题在这里已经有答案了 我有一张名为FEMALE在我的数据库中 它有ID as Primary Key 它有一个Image column 我的问题是如何使用 SQL 查询存储图像 尝试一下 insert into tableName I
  • 使用绑定和空值命中 Oracle 索引的最佳查询

    我有一个表 该表在多个列上有一个索引 其中许多列可以为空 CREATE UNIQUE INDEX UX MYTABLE A B C D E ON MYTABLE A B C D E 现在 我在 C 代码中尝试检查该表并精确命中索引 对于每个
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • 具有 LINQ 支持的最完整的 ORM?

    我正在寻找一个提供完整或接近完整的 LINQ 支持的 ORM LINQ 到 SQL 支持 LINQ 内部的所有内容 Contains Math Log 等 在不创建新数据上下文的情况下无法预先加载关系属性 ADO NET 实体框架 糟糕的
  • SQL Server PIVOT 函数

    我有一个检索所有代理及其模块的查询 结果集将每个模块返回 1 行 SELECT am agentID AS agentid pa agentDisplayName agentdisplayname m ModuleName ModuleNa
  • 将列的值添加到 LIKE 语句中?

    我有 3 个标签表 标签类别和使用过的标签 我想要获取所有标签的列表以及已使用标签的计数 所使用标签的格式是每个具有标签的文档 ID 的逗号分隔值 我一直在尝试类似的方法 但无法将tags tag 字段的值插入到LIKE 语句中 SELEC
  • 如何将自定义类型数组传递给 Postgres 函数

    我有一个自定义类型 CREATE TYPE mytype as id uuid amount numeric 13 4 我想将它传递给具有以下签名的函数 CREATE FUNCTION myschema myfunction id uuid
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • Postgres、更新和锁定顺序

    我正在研究 Postgres 9 2 有 2 个更新 每个更新都有自己的事务 一个看起来像 UPDATE foo SET a 1 WHERE b IN 1 2 3 4 另一个也类似 UPDATE foo SET a 2 WHERE b IN
  • Quartz.NET 设置 MisfireInstruction

    我正在使用 Quartz NET 在 C 中工作 并且在 CronTrigger 上设置失火指令时遇到问题 我正在运行安装了 Quartz DB 的 SQL 后端 我有以下代码 可以很好地创建作业和运行调度程序 IScheduler sch
  • Rails csv 格式的原始查询,通过控制器返回

    我使用 Active Record 来获取我的故事 然后生成 CSV 这是在 Rails Cast 中完成的标准方法 但我有很多行 需要几分钟 我想如果我能让 posgresql 来做 csv 渲染 那么我可以节省一些时间 这是我现在所拥有
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 如何在数据库中存储年月?

    是否有在数据库中存储年份和月份的标准方法 我需要根据月份和年份制作一些报告 我无法使用日期和函数实时提取月份 因为表很大 所以我需要预处理 我会和 Michael 的建议是什么 https stackoverflow com a 81694
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B

随机推荐

  • 在 Java 中,给定一个 IP 地址范围,返回覆盖该范围的 CIDR 块的最小列表

    我在将 IP 地址范围转换为 CIDR 块列表时遇到一些逻辑问题 我确实相信这个网站做得对 http ip2cidr com 我想传入一个起始 IP 地址和一个结束 IP 地址 并让 java 吐出所需的 CIDR 块的最小列表 以仅覆盖传
  • 如何防止 Cassandra 提交日志填满磁盘空间

    我正在 AWS 上运行一个两节点 Datastax AMI 集群 昨天 卡桑德拉开始拒绝一切事物的连接 系统日志没有显示任何内容 之后lot在修补过程中 我发现提交日志已填满分配的安装上的所有磁盘空间 这似乎导致连接拒绝 删除了一些提交日志
  • 如何使用 mod_proxy 保留通过 AJP 连接器发送到 Apache 的 Tomcat HTTP 响应的 Content-Type 标头

    我遇到了 HTTP 响应不正确的问题Content Type通过 AJP 1 3 连接器访问 Apache 后面的 Tomcat 中托管的 Axis2 Web 服务时 会使用此标头 我可以通过其 RESTful 接口在浏览器中毫无问题地访问
  • 如何在窗口形式的datagridview单元格中放置自定义控件

    我正在开发一个窗口窗体应用程序 我需要在数据网格视图的单元格中放置由两个标签组成的自定义控件 我已经创建了自定义控件 指导我使用自定义控件填充单元格 我认为您想创建自己的编辑控件来实现 IDataGridViewEditingControl
  • 将列表的元素转换为二进制

    假设我有一个列表 lst 0 1 0 0 我怎样才能让python将此列表解释为二进制数0100 以便2 0100 给我01000 我能想到的唯一方法是首先创建一个函数 将 二进制 元素转换为相应的整数 以 10 为基数 然后使用 bin
  • Spring Security NoClassDefFoundError 错误

    从事 Spring 项目并正在学习使用 Spring Security 该项目正在发挥作用 但突然决定不这样做 谁能解释一下为什么 WebInit java package com catalyst Config import javax
  • Redis批量插入

    我正在考虑使用 Redis 协议进行批量插入 如下所述 http redis io topics mass insert在我忙于编写代码来处理这个问题之前 我只想确保我清楚 Redis 需要什么来完成这项工作 上面的链接建议 要使用批量插入
  • 如何处理返回除 ViewResult 之外的结果的操作的授权?

    我在 ASP NET MVC 控制器上使用自定义授权过滤器 如果用户在特定操作上授权失败 该过滤器会将用户重定向到登录屏幕以外的 URL 这对于返回视图的操作来说是可以的 但是我的许多操作返回其他结果类型 例如 PartialResult
  • 实际的机器代码在各个方面是什么样子的? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 关于机器代码到底是什么似乎有很多观点 我听有人说它是汇编 二进制或十六进制 机器代码本质
  • Java Swing 的地图 API

    我想在 swing 应用程序中可视化地理地图 我只找到了 swingx 地图 api 你还知道其他开源地图API吗 Try Geotools 它有一个很好的地理空间数据API和工具
  • Swift Mac OSX NSButton 标题颜色

    我想知道如何在 swift 中将标题颜色更改为 NSButton 我在 Objective C 中看到了很多示例 但我认为 swift 中的实现是不同的 任何人都可以为我提供一个示例吗 试试这个viewDidLoad或某处 在斯威夫特 3
  • 如何解决 MS Access 2010 中的“条件表达式中的数据类型不匹配”错误? [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在尝试对 MS Access 数据库中的报告进行故障排除 该文件是由在我加入我所工作的组织之前担任我的职位的人员构建的 报告抛出错误 条件表达式中的数据类型不匹配 这使我相信导入数据库
  • 运行时主机到底是什么?

    Runtime Host 的确切定义是什么 来自MSDN 公共语言运行时被设计为支持各种不同类型的应用程序 从Web 服务器应用程序到具有传统的丰富Windows 用户界面的应用程序 每种类型的应用程序都需要运行时主机来启动它 运行时主机将
  • 如何在 Java 中检测 Image 对象上的鼠标单击事件?

    实施 国王角Java 中的 美化的多人纸牌游戏 我试图允许玩家将一张牌 图像 从他们的手上拖到桌子上的其他地方 问题在于玩家的手是 扇形 的 因此纸牌的图像会旋转并且重叠 这是一手牌的例子 我考虑过让每张卡都成为JPanel 但问题是我必须
  • C++ 先前的定义错误

    因此 感谢这个网站 我找到了之前问题的答案 我正在向 GNU automake 项目中的类添加一个函数 该函数使用指向doc目的 依赖项包含在 Makefile am 文件中以包含doc h and plsa h按各自的顺序 但是 当我编译
  • 为什么这段代码不抛出 NullPointerException

    我只是和我的朋友讨论使用类名调用静态方法 并尝试了这段代码 并期望它在运行时抛出 NPE 但事实证明它没有作用 我只是想了解执行顺序 public class One public static void method System out
  • NSObject.BroadSystemFontWeights 警告消息是什么意思?

    我最近将 XCode 更新到 7 0 并收到以下警告消息 Xcode IDEInterfaceBuilder Cocoa NSObject BroadSystemFontWeights 这是什么意思以及如何摆脱它 当我将字体粗细设置为时 我
  • 使用 document.execCommand('copy') 复制到剪贴板因大文本而失败

    我使用隐藏文本区域来放置一些文本 选择它 然后使用 document execCommand 将其复制到剪贴板 这通常有效 但当文本很大时会失败 返回 false 在 Chrome v55 中 它似乎在 180K 字符左右失败 通过这种方式
  • 如何使用 Haskell 向量编写并行代码?

    一只手 在 Haskell 中Vector a似乎是用作数字数组的首选类型 甚至还有一个 不完整的 矢量教程 另一方面 Control Parallel Strategies主要是根据Traversable 矢量库不提供这些实例 的最小完整
  • 如何批量更新 postgres 中的单个列 5500 万条记录

    我想更新 postgres 表的一列 记录大约有 5500 万条 因此我们需要批量更新 10000 条记录 注意 我们要更新所有行 但我们不想锁定我们的桌子 我正在尝试以下查询 Update account set name Some na