PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Referência de coluna ambígua em INSERT ... ON CONFLICT DO UPDATE


Você precisa qualificar a coluna onde ela seria ambígua.
Use o nome da tabela virtual excluded para se referir à linha de entrada. Mas você provavelmente quer se referir à coluna de destino, então qualifique com o nome da tabela de destino:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1  -- here
RETURNING count;

O manual:

A única linha da tabela de entrada virtual excluded contém todos colunas da tabela de destino, mesmo que não estejam listadas na lista de colunas de destino do INSERT ou os VALUES expressão. Portanto, a ambiguidade que você encontrou está sempre presente, seja count é direcionado explicitamente ou não.

À parte:Colunas omitidas na lista de colunas de destino padrão para sua respectiva coluna DEFAULT valor, que é NULL por padrão (NULL sendo a coluna padrão DEFAULT ). Ou seja, o padrão seria NULL em sua configuração e 1 na minha configuração melhorada abaixo. E acionadores de nível de linha BEFORE INSERT (se houver) são aplicadas.

Mas nada disso se aplica ao exemplo, pois se refere ao destino coluna afinal.

Notavelmente, as outras duas instâncias do nome da coluna count são inequívocos (e, portanto, não requerem qualificação de tabela), pois podem se referir apenas ao destino tabela.

Sua configuração pode quebrar facilmente enquanto a coluna count não está definido NOT NULL , como NULL + 1 ainda é NULL . Essa configuração faria mais sentido:
CREATE TABLE test.test_counter (
  id    text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);

Também não usando nomes de casos CaMeL citados no meu exemplo. Ver: