Het was mij niet duidelijk waarom je dat doet bij WITH first SELECT, maar de reden dat je alleen UPDATE id
terugkrijgt is omdat je de INSERT return niet selecteert.
Zoals vermeld (en gelinkt) in opmerkingen, ondersteunt Postgres 9.5 de INSERT ON CONFLICT-clausule, wat een veel schonere manier is om te gebruiken.
En enkele voorbeelden van voor en na 9.5:
Vóór 9.5:gebruikelijke manier met 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;
Na 9.5:gebruik 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;
UPDATE:
Zoals in een opmerking werd gesuggereerd, kunnen er kleine nadelen zijn bij het gebruik van INSERT .. ON CONFLICT
manier.
In het geval dat de tabel auto-increment gebruikt en deze zoekopdracht veel voorkomt, dan WITH
misschien een betere optie.
Meer zien:https://stackoverflow.com/a/39000072/1161463