Не ми беше ясно защо правите при WITH първо SELECT, но причината да получите само връщане на UPDATE id
е, защото не избирате INSERT return.
Както беше споменато (и свързано) в коментарите, Postgres 9.5 поддържа клауза INSERT ON CONFLICT, която е много по-чист начин за използване.
И някои примери преди и след 9.5:
Преди 9.5:обичаен начин за използване на 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;
След 9.5:използване на 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;
АКТУАЛИЗАЦИЯ:
Както беше намекнато в коментар, може да има леки недостатъци при използването на INSERT .. ON CONFLICT
начин.
В случай, че таблицата използва автоматично нарастване и тази заявка се случва често, тогава WITH
може да е по-добър вариант.
Вижте още:https://stackoverflow.com/a/39000072/1161463