PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak pobrać identyfikator wstawionego wiersza podczas używania upsert z klauzulą ​​WITH w Posgres 9.5?

Nie było dla mnie jasne, dlaczego robisz z pierwszym SELECT, ale powód, dla którego zwracasz tylko UPDATE id dzieje się tak, ponieważ nie wybierasz opcji INSERT return.

Jak wspomniano (i linki) w komentarzach, Postgres 9.5 obsługuje klauzulę INSERT ON CONFLICT, która jest znacznie czystszym sposobem użycia.

I kilka przykładów przed i po 9.5:

Przed 9.5:powszechny sposób używania Z

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;

Po 9.5:używanie WSTAW… PRZY KONFLIKTIE

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;

AKTUALIZACJA:

Jak zasugerowano w komentarzu, użycie INSERT .. ON CONFLICT może mieć niewielkie wady droga.
W przypadku, gdy tabela używa autoinkrementacji i to zapytanie często się zdarza, wtedy WITH może być lepszą opcją.
Zobacz więcej:https://stackoverflow.com/a/39000072/1161463




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw NULL do bazy danych PostgreSQL przez PHP, gdy pole daty jest puste

  2. błąd połączenia z bazą danych związany z kodowaniem

  3. BŁĄD:buforowany plan nie może zmienić typu wyniku podczas mieszania DDL z SELECT przez JDBC

  4. Tworzenie funkcji w Postgresql, która nie zwraca wartości złożonych

  5. Jak słowa kluczowe IMMUTABLE, STABLE i VOLATILE wpływają na zachowanie funkcji?