PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich die ID der eingefügten Zeile abrufen, wenn upsert mit WITH-Cluase in Posgres 9.5 verwendet wird?

Es war mir nicht klar, warum Sie bei WITH first SELECT tun, aber der Grund, warum Sie nur UPDATE id zurückgeben liegt daran, dass Sie INSERT return nicht auswählen.

Wie in den Kommentaren erwähnt (und verlinkt), unterstützt Postgres 9.5 die INSERT ON CONFLICT-Klausel, die eine viel sauberere Art der Verwendung ist.

Und einige Beispiele von vor und nach 9.5:

Vor 9.5:übliche Verwendung von WITH

WITH    u AS (
            UPDATE      products
            SET         product_key='test123', count_parts=33
            WHERE       product_key = 'test123'
            RETURNING   id
        ),i AS (
            INSERT
            INTO        products ( product_key, count_parts )
            SELECT      'test123', 33
            WHERE       NOT EXISTS( SELECT 1 FROM u )
            RETURNING   id
        )
SELECT  *
FROM    (       SELECT id FROM u
        UNION   SELECT id FROM i
        ) r;

Nach 9.5:mit INSERT .. ON CONFLICT

INSERT INTO products ( product_key, count_parts )
VALUES      ( 'test123', 33 )
ON CONFLICT ( product_key ) DO
UPDATE
SET         product_key='test123', count_parts=33
RETURNING   id;

AKTUALISIERUNG:

Wie in einem Kommentar angedeutet, kann die Verwendung von INSERT .. ON CONFLICT leichte Nachteile haben Weg.
Falls Tabelle Autoinkrement verwendet und diese Abfrage häufig vorkommt, dann WITH könnte eine bessere Option sein.
Weitere Informationen:https://stackoverflow.com/a/39000072/1161463