sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan henter man id for indsat række, når man bruger upsert med WITH cluase i Posgres 9.5?

Det var ikke klart for mig, hvorfor du gør det ved WITH first SELECT, men grunden til, at du kun får returneret UPDATE id er fordi du ikke vælger INSERT return.

Som nævnt (og linket) i kommentarer, understøtter Postgres 9.5 INSERT ON CONFLICT-klausul, som er en meget renere måde at bruge.

Og nogle eksempler på før og efter 9.5:

Før 9.5:almindelig måde at bruge MED

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:ved hjælp af 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;

OPDATERING:

Som antydet i en kommentar kan der være små ulemper ved at bruge INSERT .. ON CONFLICT vej.
Hvis tabel bruger automatisk stigning, og denne forespørgsel sker meget, så WITH kan være en bedre mulighed.
Se mere:https://stackoverflow.com/a/39000072/1161463




  1. Lagret procedure fejl PLS-00201:identifikator 'UTL_HTTP' skal erklæres

  2. Sammenligning af datoer i MySQL ignorerer tidsdelen af ​​et DateTime-felt

  3. Oprettelse af en valgmenu i PHP med standard valgt fra MySQL db

  4. Vil et SQL Server-job springe en planlagt kørsel over, hvis det allerede kører?