Ce n'était pas clair pour moi pourquoi vous faites à WITH first SELECT, mais la raison pour laquelle vous obtenez uniquement UPDATE id
c'est parce que vous ne sélectionnez pas INSERT return.
Comme mentionné (et lié) dans les commentaires, Postgres 9.5 prend en charge la clause INSERT ON CONFLICT qui est une manière beaucoup plus propre d'utiliser.
Et quelques exemples d'avant et d'après 9.5 :
Avant la version 9.5 :utilisation courante de 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;
Après 9.5 :utilisation de 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;
MISE À JOUR :
Comme indiqué dans un commentaire, il peut y avoir de légers inconvénients en utilisant INSERT .. ON CONFLICT
façon.
Dans le cas où la table utilise l'auto-incrémentation et que cette requête se produit souvent, alors WITH
pourrait être une meilleure option.
En savoir plus :https://stackoverflow.com/a/39000072/1161463