【发布时间】:2013-10-26 02:09:22
【问题描述】:
我有一个包含两个表的数据库(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),然后使用普通 SQL 将数据分发到两个目标表是加载和按摩数据的常用方法。
-
我应该为此创建一个存储过程吗?或者只是将 sql 与文件加载脚本一起保存在某个地方?
-
一个 db 函数(在 Postgres 中它们是函数,而不是存储过程)是一种简单的方法来封装将数据从一个表移动到另一个表的逻辑,所以是的,它工作得很好。如果列和表定期更改,在加载脚本中保留纯 SQL 可能更有意义,但如果它是相当静态的,我会倾向于走函数路线。
标签: php sql postgresql csv