0

我有一个包含两个表的数据库(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 文件并将这些信息拆分为某种脚本?

4

1 回答 1

1

您可以使用 COPY 命令先将数据加载到结构与 CSV 匹配的中间表中(例如:COPY intermediary_table FROM '/path/to/csv/charges.csv'DELIMITER','CSV;),然后选择数据到每个表中。第一个查询是 SELECT DISTINCT invoice_id, invoice_data INTO invoices FROM intermediary_table,第二个查询是 SELECT DISTINCT charge_id, invoice_id, charge_data INTO charge FROM intermediary_table。

顺便说一句,您很可能不需要使用 bigint(除非您期望有数十亿行)。

于 2013-10-25T18:09:22.253 回答