Nebylo mi jasné, proč děláte WITH first SELECT, ale důvod, proč vracíte pouze UPDATE id
je to proto, že nezvolíte INSERT return.
Jak bylo zmíněno (a propojeno) v komentářích, Postgres 9.5 podporuje INSERT ON CONFLICT Clause, což je mnohem čistší způsob použití.
A některé příklady před a po 9.5:
Před verzí 9.5:běžný způsob používání 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;
Po 9.5:pomocí 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;
AKTUALIZACE:
Jak je naznačeno v komentáři, použití INSERT .. ON CONFLICT
může mít drobné nevýhody způsob.
V případě, že tabulka používá automatické zvýšení a tento dotaz se často vyskytuje, pak WITH
může být lepší varianta.
Zobrazit více:https://stackoverflow.com/a/39000072/1161463