vfclists Asked: 2016-03-19 00:59:51 +0800 CST2016-03-19 00:59:51 +0800 CST 2016-03-19 00:59:51 +0800 CST PostgreSQL COPY 命令是否可以选择将 CSV 列映射到哪些字段? 772 PostgreSQLCOPY命令是否可以选择将 CSV 列映射到哪些字段? PostgreSQLCOPY命令似乎期望目标表与其列完全匹配。我错过了什么还是它实际上是如何工作的? 是否有一些替代命令可以实现这一点? postgresql copy 2 个回答 Voted Best Answer dezso 2016-03-19T01:28:33+08:002016-03-19T01:28:33+08:00 这是绝对有可能的 - 有用的文档再次来拯救: COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | PROGRAM 'command' | STDIN } [ [ WITH ] ( option [, ...] ) ] 这意味着您可以执行以下操作: COPY my_table (mt_id, mt_name, mt_created_by, ...) FROM 'filename' [...] 您不能做的是引用 CSV 文件的列。为了克服这个问题,可以创建一个具有匹配列数和类型的中间表,在其中执行操作COPY,然后INSERT ... SELECT ...对最终目标执行操作。根据Patrick7的重要评论,中间表可以定义为UNLOGGED,当表很大时可以节省大量的 WAL 开销。 Neil McGuigan 2016-03-19T10:53:51+08:002016-03-19T10:53:51+08:00 获取一份CSVKit的副本 in2csv foo.csv | csvcut -C "columnIDontWant,AnotherIDontWant" | csvsql --db postgresql://localhost/dbname --insert --tables Foo --no-create 或csvquote csvquote | cut -d, -f... | csvquote - u | psql ...
这是绝对有可能的 - 有用的文档再次来拯救:
这意味着您可以执行以下操作:
您不能做的是引用 CSV 文件的列。为了克服这个问题,可以创建一个具有匹配列数和类型的中间表,在其中执行操作
COPY
,然后INSERT ... SELECT ...
对最终目标执行操作。根据Patrick7的重要评论,中间表可以定义为UNLOGGED
,当表很大时可以节省大量的 WAL 开销。获取一份CSVKit的副本
或csvquote