Du skal tabelkvalificere kolonnen, hvor den ellers ville være tvetydig.
Brug det virtuelle tabelnavn excluded
for at henvise til inputrækken. Men du vil sandsynligvis henvise til målkolonnen, så kvalificere dig med navnet 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 enkelte række fra den virtuelle inputtabel excluded
indeholder alle kolonner i måltabellen, selvom de ikke er angivet i målkolonnelisten for INSERT
eller VALUES
udtryk. Så den tvetydighed, du stødte på, er der altid, uanset om count
er målrettet eksplicit eller ej.
Til side:Kolonner udeladt i målkolonnelisten er som standard deres respektive kolonne DEFAULT
værdi, som er NULL
som standard (NULL
er standardkolonnen DEFAULT
). Dvs., den vil som standard være NULL
i din opsætning og 1
i min forbedrede opsætning nedenfor. Og udløser på rækkeniveau BEFORE INSERT
(hvis nogen) anvendes.
Men intet af det gælder for eksemplet, da det refererer til målet kolonne trods alt.
Især de to andre forekomster af kolonnenavnet count
er utvetydige (og kræver derfor ikke tabelkvalifikation), da de kun kan referere til målet tabel.
Din opsætning kan nemt gå i stykker, mens kolonnen count
er ikke defineret NOT NULL
, som NULL + 1
er stadig NULL
. Denne opsætning ville give mere mening:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
Bruger heller ikke citerede CaMeL-tilfældenavne i mit eksempel. Se: