PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment récupérer l'identifiant de la ligne insérée lors de l'utilisation d'upsert avec WITH cluase dans Posgres 9.5 ?

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