如果不存在则INSERT到外表

时间:2017-02-10 23:46:36

标签: database postgresql insert foreign-key-relationship common-table-expression

我们将相当大的表格标准化为单独的商店名称和产品详细信息,例如:

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的名称和product_url按名称执行相同的操作

是否有Postgres方法一次性将数据插入此表(和外表),而无需逐个进行所有这些检查?我看过CTE(WITH),但我不确定这是解决这个问题的方法。

代码的来回性质以及它在交易中变得沉重。

有一些older SO posts相似,但解决方案似乎并不可行。我正在使用USPERT和CTE来查看this one

1 个答案:

答案 0 :(得分:0)

经过相当多的游戏后,我找到了stackoverflow post的答案。

@Erwin Brandstetter的答案是Function with UPSERT in Postgres 9.5,这是一个很好的方式!如此令人印象深刻。