使用其他列中的静态数据在 Postgres 中导入 CSV

NBh*_*tti 2 postgresql bulk-insert

如何COPY在 Postgres 中创建 CSV 文件以及不在 CSV 中的列的静态数据?在 MySQL 中,我可以LOAD DATA INFILE ...对列名以及文件中不存在的列的任何值进行分析。我想用 Postgres 做类似的事情,但COPY命令不支持。

dez*_*zso 6

您必须创建一个中间表作为 的目标COPY,然后在第二步中插入到最终表中。

如果您不必保留中间表(用于交叉检查您的结果,或作为一个简单的重试点),您可以将其设为临时且未记录:

BEGIN;

CREATE TEMP UNLOGGED TABLE intermediate (... columns matching the CSV contents ...);

COPY intermediate FROM 'your.csv' WITH (FORMAT csv, ...);

INSERT INTO final_table (column1, column2, column_with_default1)
SELECT col1, col2, 'default'
  FROM intermediate;

-- check if everything looks fine, row counts match the expectation, etc.

COMMIT;
Run Code Online (Sandbox Code Playgroud)

UNLOGGED当 CSV 很大时,将阻止大量 WAL 写入。我把默认进入SELECT的部分INSERT,而不是(临时)表的节约资源-没有必要存储相同的默认值多次。