如何使用Postgres中的CSV文件更新选定的行?
我使用的Postgres,并希望做一个大的更新查询,将从一个CSV文件中提取,可以说我有一个表(id, banana, apple)
。
我想运行一个更新,改变香蕉,而不是苹果,每个新的香蕉和他们的ID将在一个CSV文件。
我试着看Postgres网站,但是例子正在杀死我。
我会COPY
文件到一个临时表,并从那里更新实际的表。 可能看起来像这样:
CREATE TEMP TABLE tmp_x (id int, apple text, banana text); -- but see below COPY tmp_x FROM '/absolute/path/to/file' (FORMAT csv); UPDATE tbl SET banana = tmp_x.banana FROM tmp_x WHERE tbl.id = tmp_x.id; DROP TABLE tmp_x; -- else it is dropped at end of session automatically
如果导入的表与要更新的表完全匹配,则可能方便:
CREATE TEMP TABLE tmp_x AS SELECT * FROM tbl LIMIT 0;
创build一个空的临时表,匹配现有表的结构,没有限制。
大桌子
如果导入表很大,可能temp_buffers
临时增加temp_buffers
(会话中的第一件事):
SET temp_buffers = '500MB'; -- example value
给临时表添加一个索引:
CREATE INDEX tmp_x_id_idx ON tmp_x(id);
并手动运行ANALYZE
,因为临时表不包含在autovacuum / auto-analyze中。
ANALYZE tmp_x;
相关答案:
- 通过ID删除数百万行的最佳方法
- 我怎样才能将普通数据从不同的模式插入到临时表中?
- 如何删除重复的条目?