我们已经标准化了相当大的表格来分隔商店名称和产品详细信息,例如:
CREATE TABLE store_products
(
id BIGINT DEFAULT PRIMARY KEY NOT NULL,
storeid INTEGER REFERENCES store(id),
productid BIGINT REFERENCES product_details(id)
producturlid BIGINT REFERENCES product_url(id)
);
我们获得 JSON 格式的商店产品转储,然后迭代每个项目并通过 Delphi 控制台应用程序将其插入到 Postgres 中。它同时执行此操作(因此 4 个线程插入并获取产品的 JSON 数组)。
它首先检查商店名称是否存在于
store
表中,如果不存在,则将其插入并缓存返回的 id,对按名称的 product
和按 url 的 product_url
执行相同的操作。
是否有一种 Postgres 方法可以一次性将数据插入到该表(和外部表)中,而无需逐一进行所有这些检查?我查看了 CTE(WITH),但我不确定这是否是这个问题的解决方案。
代码的来回性质以及它在事务中的性质变得很重。
经过相当多的尝试后,我从这篇stackoverflow帖子中找到了答案。
答案是@Erwin Brandstetter 的
Function with UPSERT in Postgres 9.5
,这是一个多么好的方法啊!太令人印象深刻了。