PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come recuperare l'ID della riga inserita quando si utilizza upsert con WITH cluase in Posgres 9.5?

Non mi era chiaro il motivo per cui lo fai in WITH first SELECT, ma il motivo per cui ottieni solo UPDATE id è perché non stai selezionando INSERT return.

Come menzionato (e collegato) nei commenti, Postgres 9.5 supporta la clausola INSERT ON CONFLICT che è un modo molto più semplice da usare.

E alcuni esempi di prima e dopo 9.5:

Prima della 9.5:modo comune di utilizzare 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;

Dopo 9.5:utilizzo 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;

AGGIORNAMENTO:

Come accennato in un commento, potrebbero esserci dei piccoli svantaggi usando INSERT .. ON CONFLICT modo.
Nel caso in cui la tabella utilizzi l'incremento automatico e questa query avvenga spesso, quindi WITH potrebbe essere un'opzione migliore.
Per saperne di più:https://stackoverflow.com/a/39000072/1161463