sql >> Database teknologi >  >> RDS >> PostgreSQL

Tvetydig kolonnehenvisning i INDSÆT ... VED KONFLIKT OPDATER

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;

Manualen:

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:




  1. Bestil varchar-streng som numerisk

  2. Det indre af MED KRYPTERING

  3. PHP Fatal fejl:Kald til udefineret funktion mssql_query()

  4. Tips til at flytte SQL Server-database fra én server til en anden - SQL Tutorial af Rajan Singh