如何在Postgresql中避免重复的同时进行批量插入

时间:2015-02-03 21:22:27

标签: javascript database node.js postgresql heroku

我正在使用在Heroku托管的nodejs(目前为止免费计划)。

我自动从其他地方获取数据(这部分工作正常,我得到JSON或CVS),我的目标是将它们添加到Prostresql数据库中。

虽然我是DB mangement和Postgresql的新手,但在发布之前我已经做了我的研究。我知道存在COPY命令,以及如何INSERT多个数据没有重复。但我的问题是两者的混合(加上另一个困难)。

我希望我的问题不违反规则。


简短版,我需要:

  • 一次添加大量数据
  • 永远不要创建重复的
  • 重命名源数据和我的表格之间的列名称

长版,详细信息:

我收集的数据来自多个来源(现在为2但会变大)并且非常大(> 1000)。

我还需要将列名重新映射到一个统一的系统。在一个源上被称为“firstDay”的东西在另一个源上被称为“dateBegin”,我希望它们在我的表中被称为“startDate”。

如果我正在使用INSERT,我在构建查询时自己(在JS中)处理这个问题。但也许COPY可以更好地做到这一点。此外,INSERT似乎有一次可以推送的数据限制,因此我需要多次划分我的查询,并且可能使用回调或承诺来避免淹没数据库。

最后,我会定期自动更新这个数据库,它们会有很多重复。希望每个数据都有一个唯一的id,我在表中存储了一个存储此id的列PRIMARY KEY。我认为它可以消除重复的任何问题,但我可能是错的。

我的第一个版本非常难看(因为循环在每个循环中创建一个新查询)并且不起作用。我想在递送另一批次之前以递归方式一次做1000个数据等待回调。这样做似乎很笨重,时间也很昂贵。如果我可以选择/重命名/重新映射列并避免重复,COPY似乎是完美的。我已经阅读了文档,但我没有看到这样做的方法。


非常感谢,欢迎任何帮助。我还在学习,请善待。

1 个答案:

答案 0 :(得分:2)

我在将临时表用于" stage"之前已经这样做了。您的数据,然后执行INSERT SELECT将数据从分段移动到生产表。

要填充临时表,您可以使用批量INSERT或COPY。

例如,

BEGIN;

CREATE TEMPORARY TABLE staging_my_table ( // your columns etc );

// Now that you have your staging table you can bulk INSERT or COPY
// into it from your code, e.g.,
INSERT INTO staging_my_table (blah, bloo, firstDay) VALUES (1,2,3), (4,5,6), etc.

// Now you can do an INSERT into your live table from your staging, e.g.,
INSERT INTO my_table (blah, bloo, startDate)
SELECT cool, bloo, firstDay
FROM staging_my_table staging
WHERE NOT EXISTS (
    SELECT 1
    FROM mytable
    WHERE staging.bloo = mytable.bloo
);

COMMIT;

总有例外,但这可能对您有用。

有一个好的