Det var ikke klart for mig, hvorfor du gør det ved WITH first SELECT, men grunden til, at du kun får returneret UPDATE id
er fordi du ikke vælger INSERT return.
Som nævnt (og linket) i kommentarer, understøtter Postgres 9.5 INSERT ON CONFLICT-klausul, som er en meget renere måde at bruge.
Og nogle eksempler på før og efter 9.5:
Før 9.5:almindelig måde at bruge MED
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:ved hjælp af 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;
OPDATERING:
Som antydet i en kommentar kan der være små ulemper ved at bruge INSERT .. ON CONFLICT
vej.
Hvis tabel bruger automatisk stigning, og denne forespørgsel sker meget, så WITH
kan være en bedre mulighed.
Se mere:https://stackoverflow.com/a/39000072/1161463