sql >> Databasteknik >  >> RDS >> PostgreSQL

Tvetydig kolumnreferens i INFOGA ... VID KONFLIKT UPPDATERA

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;

Manualen:

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:




  1. SQL för att skapa matristabell

  2. Om villkorligt i SQL Script för Mysql

  3. System.Data.OracleClient.OracleException:ORA-01036:olagligt variabelnamn/nummer

  4. Lägg till anpassat dolt fält i PayPal-form och få det på omdirigerad sida