Вместо использования WHERE NOT EXISTS
я обнаружил, что более устойчивым решением для массовых вставок было LEFT JOIN..WHERE NULL
.Это включает в себя левое соединение с данными, которые я хотел вставить, и выбор данных, для которых в старой таблице не было соответствующих данных.В следующем примере, скажем, у меня были следующие данные о ценах (представленные в JSON):
[{price: 11.99, product_id0:2},
{price: 10.50, product_id0:3},
{price: 10.00, product_id0:4}]
Следующий запрос вставил бы подмножество этих данных, если какая-либо из них будет новой информацией:
insert into prices_history (product_id0, time_added, price)
(
select new_product_id0, new_time_added, new_price from
(select unnest(array[11.99, 10.50, 10.00]) as new_price, unnest(array[2,3,4]) as new_product_id0, now() as new_time_added) new_prices left join
(select distinct on (product_id0) * from prices_history order by product_id0, time_added desc) old_prices
on old_prices.product_id0 = new_prices.new_product_id0 and old_prices.listed_price= new_prices.new_price
where old_prices.product_id0 is null and old_prices.listed_price is null
) returning id0
Этот новый запрос, кажется, хорошо работает в текущем развертывании.