sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo recuperar la identificación de la fila insertada cuando se usa upsert con CON cláusula en Posgres 9.5?

No estaba claro para mí por qué lo hace en CON la primera SELECCIÓN, pero la razón por la que solo obtiene ACTUALIZAR id es porque no está seleccionando INSERTAR retorno.

Como se mencionó (y se vinculó) en los comentarios, Postgres 9.5 es compatible con la cláusula INSERT ON CONFLICT, que es una forma mucho más limpia de usar.

Y algunos ejemplos del antes y después de la 9.5:

Antes de 9.5:forma común de usar 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;

Después de 9.5:usando INSERTAR... EN CONFLICTO

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;

ACTUALIZACIÓN:

Como se insinuó en un comentario, puede haber ligeras desventajas al usar INSERT .. ON CONFLICT camino.
En caso de que la tabla utilice el incremento automático y esta consulta ocurra con frecuencia, entonces WITH podría ser una mejor opción.
Ver más:https://stackoverflow.com/a/39000072/1161463