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: