Es war mir nicht klar, warum Sie bei WITH first SELECT tun, aber der Grund, warum Sie nur UPDATE id
zurückgeben liegt daran, dass Sie INSERT return nicht auswählen.
Wie in den Kommentaren erwähnt (und verlinkt), unterstützt Postgres 9.5 die INSERT ON CONFLICT-Klausel, die eine viel sauberere Art der Verwendung ist.
Und einige Beispiele von vor und nach 9.5:
Vor 9.5:übliche Verwendung von 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;
Nach 9.5:mit 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;
AKTUALISIERUNG:
Wie in einem Kommentar angedeutet, kann die Verwendung von INSERT .. ON CONFLICT
leichte Nachteile haben Weg.
Falls Tabelle Autoinkrement verwendet und diese Abfrage häufig vorkommt, dann WITH
könnte eine bessere Option sein.
Weitere Informationen:https://stackoverflow.com/a/39000072/1161463