【问题标题】:postgresql copy few csv columns to specific column on my tablepostgresql 将几个 csv 列复制到我表上的特定列
【发布时间】:2017-08-13 23:00:32
【问题描述】:

我使用 postgresql 副本将我的 csv 文件存储到我的表中。但事情在我的 csv 表上,我有 4field

f2 f5 f6 f13

在我的 postgresql 表上有 8 个表

f1 f2 f3 f4 f5 f6 f7 f8

我想让f1成为我制作的序列,f3是current_date,另一个是null

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

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

【问题讨论】:

    标签: postgresql csv


    【解决方案1】:

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

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

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


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

    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)在系统目录中作为不可见的僵尸保存,这可能会产生一些轻微的副作用。见:

    相关:

    【讨论】:

    • f13 是我不需要放入数据库的数据
    • @AlexanderChandra:我又添加了一个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2020-07-05
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多