Upsert
Отговорът от Linoff
е правилен, но може да се опрости малко чрез Нова функция ”UPSERT“ на Postgres 9.5
(известен още като MERGE
). Тази нова функция е внедрена в Postgres като INSERT ON CONFLICT
синтаксис.
Вместо изрично да проверяваме за нарушение на уникалния индекс, можем да позволим на ON CONFLICT
клауза открива нарушението. Тогава ние DO NOTHING
, което означава, че изоставяме усилията да INSERT
без да си правите труда да опитате UPDATE
. Така че, ако не можем да вмъкнем, просто преминаваме към следващия ред.
Получаваме същите резултати като кода на Linoff, но губим WHERE
клауза.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;