使用 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 作为参数。
我想将一个将数据从 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 作为参数。