sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur hämtar man id för den infogade raden när man använder upsert med WITH cluase i Posgres 9.5?

Det var inte klart för mig varför du gör det med WITH first SELECT, men anledningen till att du bara får tillbaka UPPDATERING id beror på att du inte väljer INSERT retur.

Som nämnts (och länkats) i kommentarer, stöder Postgres 9.5 INSERT ON CONFLICT Clause som är ett mycket renare sätt att använda.

Och några exempel på före och efter 9.5:

Före 9.5:vanligt sätt att använda 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;

Efter 9.5:använder 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;

UPPDATERING:

Som antytts i en kommentar kan det finnas små nackdelar med att använda INSERT .. ON CONFLICT sätt.
Om en tabell använder automatisk inkrement och denna fråga händer mycket, sedan WITH kan vara ett bättre alternativ.
Se mer:https://stackoverflow.com/a/39000072/1161463




  1. JDBC-typ Scroll okänslig och känslig

  2. mysql räkna ord i sql syntax

  3. kan inte mata ut miniatyren på skärmen jag får en ren vit skärm med en liten trasig bild uppe till vänster

  4. Hur kan jag ställa in startpunkten för kolumnen primärnyckel (ID) i Postgres via en rails-migrering