Wie finde ich heraus, ob ein Upsert ein Update mit PostgreSQL 9.5+ UPSERT war?
Writable CTEs wurden vor Version 9.5 als Lösung für UPSERT angesehen, wie in @ beschriebeInsert, bei doppeltem Update in PostgreSQL?
Es ist möglich, einen UPSERT mit der Information durchzuführen, ob er als UPDATE oder INSERT mit der folgenden beschreibbaren CTE-IDiom endete:
WITH
update_cte AS (
UPDATE t SET v = $1 WHERE id = $2 RETURNING 'updated'::text status
),
insert_cte AS (
INSERT INTO t(id, v) SELECT $2, $1 WHERE NOT EXISTS
(SELECT 1 FROM update_cte) RETURNING 'inserted'::text status
)
(SELECT status FROM update_cte) UNION (SELECT status FROM insert_cte)
Diese Abfrage gibt entweder "aktualisiert" oder "eingefügt" zurück oder kann (selten) mit einer Einschränkungsverletzung fehlschlagen, wie in @ beschriebehttps: //dba.stackexchange.com/questions/78510/why-is-cte-open-to-lost-update
Kann etwas Ähnliches mit der neuen "UPSERT" -Syntax von PostgreSQL 9.5+ erreicht werden, die von ihrer Optimierung profitiert und die mögliche Verletzung von Beschränkungen vermeidet?