sql >> Databáze >  >> RDS >> PostgreSQL

Jak načíst ID vloženého řádku při použití upsert s WITH cluase v Posgres 9.5?

Nebylo mi jasné, proč děláte WITH first SELECT, ale důvod, proč vracíte pouze UPDATE id je to proto, že nezvolíte INSERT return.

Jak bylo zmíněno (a propojeno) v komentářích, Postgres 9.5 podporuje INSERT ON CONFLICT Clause, což je mnohem čistší způsob použití.

A některé příklady před a po 9.5:

Před verzí 9.5:běžný způsob používání 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;

Po 9.5:pomocí 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;

AKTUALIZACE:

Jak je naznačeno v komentáři, použití INSERT .. ON CONFLICT může mít drobné nevýhody způsob.
V případě, že tabulka používá automatické zvýšení a tento dotaz se často vyskytuje, pak WITH může být lepší varianta.
Zobrazit více:https://stackoverflow.com/a/39000072/1161463




  1. Musím se chránit před vkládáním SQL, pokud jsem použil rozevírací seznam?

  2. Vlastní dotazy na jaře s JPA

  3. Database-Aware Load Balancing:Jak migrovat z HAProxy na ProxySQL

  4. PostgreSQL nahrazuje funkci HTML entity