如何在避免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;
总是有例外,但这可能只适用于你。
祝你有个好的一天