Sloupec, kde by byl jinak nejednoznačný, musíte kvalifikovat jako tabulku.
Použijte název virtuální tabulky excluded
odkazovat na vstupní řádek. Pravděpodobně však chcete odkazovat na cílový sloupec, takže kvalifikujte s názvem cílové tabulky:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
Jediný řádek z virtuální vstupní tabulky excluded
obsahuje vše sloupce cílové tabulky, i když nejsou uvedeny v seznamu cílových sloupců INSERT
nebo VALUES
výraz. Takže nejednoznačnost, se kterou jste se setkali, existuje vždy, ať už count
je cíleno explicitně nebo ne.
Stranou:Sloupce vynechané v seznamu cílových sloupců mají výchozí hodnotu pro příslušný sloupec DEFAULT
hodnota, což je NULL
ve výchozím nastavení (NULL
je výchozí sloupec DEFAULT
). To znamená, že výchozí nastavení bude NULL
ve vašem nastavení a 1
v mém vylepšeném nastavení níže. A spouštěče na úrovni řádku BEFORE INSERT
(pokud existují).
Ani jedno z toho však neplatí pro příklad, protože odkazuje na cíl sloupec přece.
Zejména další dva výskyty názvu sloupce count
jsou jednoznačné (a nevyžadují tedy kvalifikaci pro tabulku), protože mohou odkazovat pouze na cíl tabulka.
Vaše nastavení se může snadno zlomit, zatímco sloupec count
není definováno NOT NULL
, jako NULL + 1
je stále NULL
. Toto nastavení by dávalo větší smysl:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
V mém příkladu také nepoužívám jména případu CaMeL v uvozovkách. Viz: