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