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?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage