如何使用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删除数百万行的最佳方法
  • 我怎样才能将普通数据从不同的模式插入到临时表中?
  • 如何删除重复的条目?