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;
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: