我使用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 文件中的值更新选定的行?