sql >> Database >  >> RDS >> PostgreSQL

Hoe id van ingevoegde rij ophalen bij gebruik van upsert met WITH-clausule in Posgres 9.5?

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




  1. Hoe te SELECTEREN over twee tabellen?

  2. Hoe waarden ophalen uit een database?

  3. php mysql groeperen op datum met de indeling jjjj-mm-dd

  4. Meerdere resultaatsets retourneren vanuit de in MYSQL opgeslagen procedure