使用 Postgres 上的静态字段从 CSV 复制

COPY FROM CSV with static fields on Postgres

我想将一个将数据从 CSV 文件导入 PostgreSQL 9.5 数据库的实际系统切换到一个更高效的系统。

我想使用 COPY 语句,因为它的性能很好。问题是我需要填充一个不在 CSV 文件中的字段。

有没有办法让 COPY 语句为所有插入的行添加一个静态字段? 完美的解决方案应该是这样的:

COPY data(field1, field2, field3='Account-005') 
FROM '/tmp/Account-005.csv' 
WITH DELIMITER ',' CSV HEADER;

您知道在每一行填充该字段的方法吗?

我的服务器是 运行 node.js 所以我愿意接受任何经济高效的解决方案,在复制之前使用节点完成文件。

为列设置默认值:

alter table data 
alter column field3 set default 'Account-005'

不要在 copy 命令中提及它:

COPY data(field1, field2) FROM...

使用 temp table 导入。这允许您:

  • add/remove/update 列
  • 添加额外的文字数据
  • 删除或忽略记录(例如重复记录)

,然后将新记录插入实际 table。


       -- target table
CREATE TABLE data
    ( id SERIAL PRIMARY KEY
    , batch_name varchar NOT NULL
    , remote_key varchar NOT NULL
    , payload varchar
        , UNIQUE (batch_name, remote_key)
        -- or::
        -- , UNIQUE (remote_key)
    );
        -- temp table
CREATE TEMP TABLE temp_data
    ( remote_key varchar -- PRIMARY KEY
    , payload varchar
    );

COPY temp_data(remote_key,payload)
FROM '/tmp/Account-005'
    ;

        -- The actual insert
        -- (you could also filter out or handle duplicates here)
INSERT INTO data(batch_name, remote_key, payload)
SELECT 'Account-005', t.remote_key, t.payload
FROM temp_data t
    ;

顺便说一句,可以将上述操作自动化:将其放入一个函数(或者可能是一个准备好的语句)中,使用 filename/literal 作为参数。