You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何按id匹配用CSV数据替换表内指定列的数值

PostgreSQL 批量更新building表操作方案

你之前导入仅新增行是因为直接对原表执行了INSERT类导入操作,没有做关联匹配更新,按以下步骤操作即可实现需求:

  • 步骤1:创建临时表存储CSV清洗数据
    临时表会在当前会话结束后自动销毁,不会产生冗余数据:
CREATE TEMP TABLE temp_building_clean (
    id INT PRIMARY KEY,
    height NUMERIC,
    "building:levels" INT
);
  • 步骤2:将CSV数据导入临时表
    根据你的CSV存储位置选择对应导入命令:
-- 1. CSV在本地电脑,psql客户端执行:
\copy temp_building_clean FROM '你的本地CSV文件路径' DELIMITER ',' CSV HEADER;

-- 2. CSV在PostgreSQL服务器上,需要superuser权限执行:
COPY temp_building_clean FROM '服务器上CSV的绝对路径' DELIMITER ',' CSV HEADER;

提示:如果你的CSV用制表符作为分隔符,把DELIMITER ','替换为DELIMITER E'\t';HEADER参数用于跳过CSV的表头行,避免把字段名作为数据导入。

  • 步骤3:关联更新原building表的对应字段
    建议执行更新前先开启事务,验证结果正确再提交,出错可直接回滚:
-- 开启事务
BEGIN;

-- 执行关联更新
UPDATE building b
SET 
  height = t.height::TEXT, -- 若原height字段为数值类型,删掉::TEXT即可
  "building:levels" = t."building:levels"
FROM temp_building_clean t
WHERE b.id = t.id;

-- 验证更新结果(可自行调整抽查的id范围)
SELECT id, tags, height, "building:levels", area 
FROM building 
WHERE id IN (1,3,5) 
ORDER BY id;

-- 验证无误后提交,出错则执行ROLLBACK;回滚
COMMIT;

如果需要保留height字段的单位后缀,把SET里的height赋值改为height = t.height::TEXT || 'm'即可。

内容的提问来源于stack exchange,提问作者cacy640

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:15:01