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