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 批量数据导入和填充相关数据的主要内容,如果未能解决你的问题,请参考以下文章
数据库中批量导入数据,有两列的值需要从其他表中查出来,我现在没有思路,求解惑
Postgres:在从 bash 脚本重新创建/重新填充之前清除整个数据库