2016-08-09 25 views
8

dostaję kanoniczny przykład:Postgres 9.5+: upsert zwrócić liczbę zaktualizowanych i wstawionych wierszy

INSERT INTO user_logins (username, logins) 
VALUES ('Naomi',1),('James',1) 
ON CONFLICT (username) 
DO UPDATE SET logins = user_logins.logins + EXCLUDED.logins; 

Ale teraz również wiedzieć:

  1. ile wierszy zostało wstawione
  2. Ile wierszy zaktualizowano, ponieważ istniejący
  3. Ile wierszy nie można wstawić z powodu ograniczeń
  4. Jeśli ograniczenie nie jest przestrzegane w ostatnim wierszu, czy poprzednie wstawione/zaktualizowane wiersze będą utrwalone w DB?

Odpowiedz

4

Nie wiem, jak inaczej można zrozumieć, co się wydarzyło. Powinieneś przyjrzeć się wartości xmax, jeśli xmax = 0 oznacza, że ​​wstawiono wiersz, inna wartość xmax tam był aktualizowany.

Mam zły angielski, a postaram się pokazać przykład.

create table test3(r1 text unique, r2 text); 
\d+ test3 
         Table "public.test3" 
Column | Type | Modifiers | Storage | Stats target | Description 
--------+------+-----------+----------+--------------+------------- 
r1  | text |   | extended |    | 
r2  | text |   | extended |    | 
Indexes: 
    "test3_r1_key" UNIQUE CONSTRAINT, btree (r1) 

INSERT

INSERT INTO test3 
VALUES('www7','rrr'), ('www8','rrr2') 
ON CONFLICT (r1) DO UPDATE SET r2 = 'QQQQ' RETURNING xmax; 
xmax 
------ 
    0 
    0 

przypadku próby wstawienia duplikat:

INSERT INTO test3 
VALUES('www7','rrr'), ('www8','rrr2') 
ON CONFLICT (r1) DO UPDATE SET r2 = 'QQQQ' RETURNING xmax; 
    xmax  
----------- 
430343538 
430343538 
(2 rows) 

INSERT 0 2 

Rezultatem mogą być przetwarzane w taki sposób:
Wkładanie 1 nowy i 1 zduplikowane wiersze

WITH t AS (
    INSERT INTO test3 
    VALUES('www9','rrr'), ('www7','rrr2') 
    ON CONFLICT (r1) DO UPDATE SET r2 = 'QQQQ' RETURNING xmax 
) 
SELECT COUNT(*) AS all_rows, 
     SUM(CASE WHEN xmax = 0 THEN 1 ELSE 0 END) AS ins, 
     SUM(CASE WHEN xmax::text::int > 0 THEN 1 ELSE 0 END) AS upd 
FROM t; 

all_rows | ins | upd 
----------+-----+----- 
     2 | 1 | 1 

zobaczyć 5.4. System Columns i MVCC

Bardzo ciekawe, jak można rozwiązać ten problem bardziej wdzięcznie