>我有一个包含两个表的数据库(postgres):
CREATE TABLE invoices (
id bigint,
some_data varchar
)
CREATE TABLE charges (
id bigint,
invoice_id bigint,
some_data varchar
)
我正在尝试将以下格式的csv文件加载到此数据库中:
invoice_id, invoice_data, charge_id, charge_data
例如,我的 csv 文件中可能有以下行:
1, $10.00, 1, $2.00
1, $10.00, 2, $5.00
1, $10.00, 3, $3.00
2, $2.00, 4, $1.00
2, $2.00, 5, $1.00
3, $11.00, 6, $11.00
此数据应对应于数据库中的以下记录:
SELECT * FROM invoices;
id | some_data
-----+-------------
1 | $10.00
2 | $2.00
3 | $11.00
SELECT * FROM charges;
id | invoice_id | some_data
-----+------------+-------------
1 | 1 | $2.00
2 | 1 | $5.00
3 | 1 | $3.00
4 | 2 | $1.00
5 | 2 | $1.00
6 | 3 | $11.00
是否有加载此类数据的"最佳实践"?目前,我正在将此文件加载到中间表中,并使用php脚本对其进行处理(不好)。这是非常低效的。有没有更好的方法?我是否应该将其加载到中间表中,然后使用存储过程来拆分信息?还是我应该直接处理我的.csv文件并在某种脚本中拆分此信息?
您可以使用
COPY 命令先将数据加载到结构与 CSV 匹配的中间表中(例如:从 '/path/to/csv/charges.csv' 分隔符 '、' CSV; 复制intermediary_table),然后选择数据到每个表中。第一个查询是"选择非重复invoice_id,从intermediary_table invoice_data成发票,第二个查询选择非重复charge_id,invoice_id,charge_data从intermediary_table进入费用。
顺便说一句,您很可能不需要使用 bigint(除非您期望数十亿行)。