Det var inte klart för mig varför du gör det med WITH first SELECT, men anledningen till att du bara får tillbaka UPPDATERING id
beror på att du inte väljer INSERT retur.
Som nämnts (och länkats) i kommentarer, stöder Postgres 9.5 INSERT ON CONFLICT Clause som är ett mycket renare sätt att använda.
Och några exempel på före och efter 9.5:
Före 9.5:vanligt sätt att använda 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;
Efter 9.5:använder 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;
UPPDATERING:
Som antytts i en kommentar kan det finnas små nackdelar med att använda INSERT .. ON CONFLICT
sätt.
Om en tabell använder automatisk inkrement och denna fråga händer mycket, sedan WITH
kan vara ett bättre alternativ.
Se mer:https://stackoverflow.com/a/39000072/1161463