Postgres 批量数据导入和填充相关数据

Posted

技术标签:

【中文标题】Postgres 批量数据导入和填充相关数据【英文标题】:Postgres Bulk Data Import and Populate Associated Data 【发布时间】:2013-06-07 13:15:40 【问题描述】:

我有一个 Postgres 数据库,它每天从各种外部来源更新几次,每条记录都有像 company_id 和 user_id 这样的字段,需要从现有表中查找并与记录一起保存。目前,我正在使用 Ruby 循环遍历新记录并通过 ActiveRecord 查询获取公司和用户 ID。但是,这非常低效。

什么是执行此操作的有效方法?更新时可以通过JOIN 查询来完成吗?

【问题讨论】:

请显示表定义和查询。不然猜测太多了。您还应该始终在问题中提及您的版本(PostgreSQL、Ruby 等)。展示你已经在做什么。 (编辑后在此处回复,我会查看)。 【参考方案1】:

这取决于您如何加载数据,如果您使用“复制”加载它而不是在导入过程中查找它。我这里也有同样的情况,我就是这样做的:

1) 将数据导入到 IMPORT 表中

\copy importtable (companyname, what, ever, i , need) from 'FILE' WITH DELIMITER AS ';' CSV HEADER;

2) 如果您导入还没有现有 ID 的新公司/用户,则此步骤是必需的。它查询没有 ID 的公司并创建新的 ID

INSERT INTO company (companyid,companyname)
SELECT  companyname
FROM importtable
        LEFT OUTER JOIN company ON (importtable.companyname=company.companyname)
WHERE company.companyid is NULL
GROUP BY companyname;

3) 将整个导入表插入到合并表中

INSERT INTO consolidationable(companyid, what,ever,you,need )
SELECT companyid, what,ever,you,need
  FROM importtable
        INNER JOIN company ON (importtable.companyname=company.companyname);

很好的是,它使用 COPY,因此导入本身很快,然后它使用所有缓冲区,因为 postgreSQL 可以一次查询所有公司 ID。当您创建多个导入表时,它可以高度并行运行。

【讨论】:

以上是关于Postgres 批量数据导入和填充相关数据的主要内容,如果未能解决你的问题,请参考以下文章

批量数据文件用sqlldr导数据到oracle中

批量数据文件用sqlldr导数据到oracle中

数据库中批量导入数据,有两列的值需要从其他表中查出来,我现在没有思路,求解惑

Postgres:在从 bash 脚本重新创建/重新填充之前清除整个数据库

oraclepostgresmysql数据库的建库创建用户导人导出备份总结

如何高效地批量导入数据到SqlServer