PostgreSQL 将几个 CSV 列复制到我表上的特定列



我使用PostgreSQL Copy将我的csv文件存储到我的表中。但是事情在我的csv表上,我有4个字段

f2 f5 f6 f13

在我的postgreSQL表上有8个表

f1 f2 f3 f4 f5 f6 f7 f8

我想使 f1 成为我制作的序列,并且 f3 是current_date,另一个是空

的这类似于我的问题,但这个问题是在 2013 年提出的(也许现在有其他解决方案?

关键是我想从csv的特定列插入到特定列postgresql,如果可能的话,我不想制作临时表

您可以使用COPY有选择地声明目标列:

COPY tbl(f2, f5, f6, f7) FROM '/path/to/file.csv'

如果源文件包含您根本不想插入到表中的列,则需要另一个(临时)表作为垫脚石 -COPY它并从那里INSERT。或者,编辑输入文件以删除多余的列。


另一种选择是临时向目标表添加一列。添加 NULL 列很便宜,并且不会触发表重写。您可以COPY到表,然后再次删除该列。这也不会触发表重写,而且也非常便宜:删除的列仍然存在,但在系统目录pg_attribute中标记为死。表上的行或VACUUM FULL的任何UPDATE或备份/还原周期都将物理删除死列。

ALTER TABLE tbl ADD COLUMN f13 text;
COPY tbl(f2, f5, f6, f13) FROM '/path/to/file.csv'
ALTER TABLE tbl DROP COLUMN f13;

如果在单个事务中完成所有操作,则该列对世界其他地方仍然不可见。

但是

  • 只有表的所有者(和超级用户)才能使用ALTER TABLE

  • 删除的列目前(Postgres 12)在系统目录中作为不可见的僵尸保留,这可能会产生一些轻微的副作用。看:

    • 在大型数据集上放置 Postgres 中的列

相关:

  • 如何使用 Postgres 中 CSV 文件中的值更新选定的行?

最新更新