如何在避免Postgresql中的重复的情况下进行批量插入

我正在使用Heroku(迄今为止的免费计划)托pipenodejs。

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

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

我希望我的问题不是违规。


短版 ,我需要:

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

长版细节:

我收集的数据来自多个来源(现在2,但会变得更大),是相当大(> 1000)。

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

如果我正在使用INSERT,则在构build查询时,我会自己处理(使用JS)。 但也许COPY可以以更好的方式做到这一点。 另外,INSERT似乎有一次你可以推入的数据的限制,所以我将需要多次划分我的查询,也许使用callback或承诺,以避免淹没数据库。

最后,我会定期更新这个数据库,并且会自动重复。 希望每一块数据都有一个唯一的ID,并且在存储这个ID的表中创build了一个PRIMARY KEY列。 我认为这可能会消除任何重复的问题,但我可能是错的。

我的第一个版本是非常丑陋的(for循环每个循环做一个新的查询),并没有工作。 我正在考虑在发送另一批次之前以recursion的方式等待callback,一次执行1000个数据。 这样做看起来笨重和时间昂贵。 复制似乎是完美的,如果我可以select/重命名/重新映射列,并避免重复。 我已经阅读了文档,我没有看到这样做的方法。


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

在使用临时表“暂存”数据之前,我已经完成了这一步,然后执行INSERT SELECT将数据从登台移动到生产表。

为了填充登台表,您可以使用批量插入或复制。

例如,

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, eg, 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, eg, 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; 

总是有例外,但这可能只适用于你。

祝你有个好的一天