Nie było dla mnie jasne, dlaczego robisz z pierwszym SELECT, ale powód, dla którego zwracasz tylko UPDATE id
dzieje się tak, ponieważ nie wybierasz opcji INSERT return.
Jak wspomniano (i linki) w komentarzach, Postgres 9.5 obsługuje klauzulę INSERT ON CONFLICT, która jest znacznie czystszym sposobem użycia.
I kilka przykładów przed i po 9.5:
Przed 9.5:powszechny sposób używania Z
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;
Po 9.5:używanie WSTAW… PRZY KONFLIKTIE
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;
AKTUALIZACJA:
Jak zasugerowano w komentarzu, użycie INSERT .. ON CONFLICT
może mieć niewielkie wady droga.
W przypadku, gdy tabela używa autoinkrementacji i to zapytanie często się zdarza, wtedy WITH
może być lepszą opcją.
Zobacz więcej:https://stackoverflow.com/a/39000072/1161463