如何通过WHERE条件批量为Postgres列填充大量数据
PostgreSQL 批量填充表字段操作方案
你不需要逐行写单条UPDATE语句,通过「临时表导入CSV+关联更新」的方式,一条SQL就能完成全量1000行数据的填充,全程耗时不到1秒。
方法一:临时表关联更新(最推荐,效率最高)
核心逻辑是先把CSV里的补充数据导入临时表,再通过关联匹配一次性更新目标表。
- 首先创建临时表,字段和CSV列对应,临时表会在你断开数据库连接后自动删除,不会残留冗余数据:
CREATE TEMP TABLE temp_update_data ( location text, name text, display_name text );
- 把CSV数据导入临时表,根据你用的客户端选对应方式:
- 如果你用psql命令行,直接执行COPY命令即可:
-- 本地文件导入用\copy,不需要数据库服务端文件权限 \copy temp_update_data(location, name, display_name) FROM '/你本地的CSV文件绝对路径/data.csv' DELIMITER ',' CSV HEADER; -- 如果CSV放在数据库服务端,用下面的COPY命令 COPY temp_update_data(location, name, display_name) FROM '/服务端CSV路径/data.csv' DELIMITER ',' CSV HEADER;- 如果你用DBeaver、Navicat等可视化工具,直接右键点击临时表选择「导入向导」,选中CSV文件按提示走完导入流程即可。
- 执行关联更新,注意匹配条件要做大小写兼容(你提供的示例里CSV和原表的location、name存在大小写差异,直接等值匹配会漏数据):
UPDATE info_table t SET display_name = c.display_name FROM temp_update_data c WHERE lower(t.location) = lower(c.location) AND lower(t.name) = lower(c.name);
如果你原表有主键ID,且CSV里也包含对应ID值,直接用ID作为关联条件准确率最高,不会因为重名、地址拼写误差更新错行。
方法二:VALUES拼接批量更新(适合不想导临时表的场景)
如果不想走导入流程,可以直接把CSV里的数值拼接到UPDATE的VALUES子句里执行,1000行数据也能正常跑:
UPDATE info_table t SET display_name = v.display_name FROM ( VALUES ('liverpool', 'Dan', 'Liverpool'), ('london', 'Louise', 'London'), ('stoke-on-trent', 'Amel', 'Stoke on Trent'), ('itchen-hampshire', 'Mark', 'itchen (hampshire)') -- 剩余行按上述格式依次拼接即可 ) AS v(location, name, display_name) WHERE lower(t.location) = lower(v.location) AND lower(t.name) = lower(v.name);
操作提示:
更新前建议先开事务验证匹配结果,避免更新错误:BEGIN; -- 开启事务,此时所有修改不会立即生效 -- 先查询匹配结果,核对新旧值对应关系 SELECT t.location, t.name, t.display_name AS 旧值, c.display_name AS 待更新新值 FROM info_table t JOIN temp_update_data c ON lower(t.location) = lower(c.location) AND lower(t.name) = lower(c.name); -- 核对返回的行数、新旧值对应关系无误后,执行UPDATE语句,再跑COMMIT提交即可 -- 如果匹配结果有问题,直接执行ROLLBACK就能回滚所有操作,不会影响原表数据
内容的提问来源于stack exchange,提问作者wycherley22
相关产品推荐
相关产品推荐

