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
相关产品推荐
相关产品推荐

