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

Niejednoznaczne odniesienie do kolumny w INSERT ... ON CONFLICT DO UPDATE

Musisz zakwalifikować do tabeli kolumnę, w której w innym przypadku byłaby niejednoznaczna.
Użyj nazwy tabeli wirtualnej excluded aby odwołać się do wiersza wejściowego. Ale prawdopodobnie chcesz odwołać się do kolumny docelowej, więc określ nazwę tabeli docelowej:

INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1  -- here
RETURNING count;

Podręcznik:

Pojedynczy wiersz z wirtualnej tabeli wejściowej excluded zawiera wszystkie kolumny tabeli docelowej, nawet jeśli nie są wymienione na liście kolumn docelowych INSERT lub VALUES wyrażenie. Tak więc niejednoznaczność, którą napotkałeś, jest zawsze obecna, niezależnie od tego, czy count jest celowo lub nie.

Poza tym:Kolumny pominięte na liście kolumn docelowych domyślnie odpowiadają odpowiedniej kolumnie DEFAULT wartość, która jest NULL domyślnie (NULL będąca domyślną kolumną DEFAULT ). Czyli domyślnie NULL w Twojej konfiguracji i 1 w mojej ulepszonej konfiguracji poniżej. A wyzwalacze na poziomie wiersza BEFORE INSERT (jeśli istnieją).

Ale nic z tego nie dotyczy przykładu, ponieważ odnosi się do celu w końcu kolumna.

Warto zauważyć, że pozostałe dwa wystąpienia nazwy kolumny count są jednoznaczne (a zatem nie wymagają kwalifikacji tabeli), ponieważ mogą odnosić się tylko do celu tabela.

Twoja konfiguracja może się łatwo zepsuć, gdy kolumna count nie jest zdefiniowany NOT NULL , jako NULL + 1 jest nadal NULL . Ta konfiguracja byłaby bardziej sensowna:

CREATE TABLE test.test_counter (
  id    text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);

Również nie używam cytowanych nazw przypadków CaMeL w moim przykładzie. Zobacz:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź, czy istnieje wyzwalacz

  2. Postgres/psycopg2 - Wstawianie tablicy ciągów

  3. Dynamiczne ORDER BY i ASC / DESC w funkcji plpgsql

  4. Uzyskaj wartości podwójnej precyzji z niespójnych ciągów, aby użyć ST_GeomFromText (PostGIS)

  5. PostgreSQL przez poddźwiękowy