Du måste tabellkvalificera kolumnen där den annars skulle vara tvetydig.
Använd det virtuella tabellnamnet excluded
för att referera till inmatningsraden. Men du vill förmodligen hänvisa till målkolumnen, så kvalificera dig med namnet på måltabellen:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
Den enda raden från den virtuella inmatningstabellen excluded
innehåller alla kolumner i måltabellen, även om de inte finns med i målkolumnlistan för INSERT
eller VALUES
uttryck. Så tvetydigheten du stött på finns alltid där, oavsett om count
är är inriktad explicit eller inte.
Bortsett från:Kolumner som utelämnats i målkolumnlistan har som standard deras respektive kolumn DEFAULT
värde, som är NULL
som standard (NULL
är standardkolumnen DEFAULT
). Dvs den skulle som standard vara NULL
i din inställning och 1
i min förbättrade inställning nedan. Och utlösare på radnivå BEFORE INSERT
(om några) tillämpas.
Men inget av det gäller för exemplet eftersom det hänvisar till målet kolumn trots allt.
Särskilt de andra två instanserna av kolumnnamnet count
är entydiga (och kräver därför inte tabellkvalificering) eftersom de bara kan referera till målet bord.
Din inställning kan lätt gå sönder medan kolumnen count
är inte definierad NOT NULL
, som NULL + 1
är fortfarande NULL
. Denna inställning skulle vara mer vettig:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
Använder inte heller citerade CaMeL-casenamn i mitt exempel. Se: