Трябва да квалифицирате таблично колоната, където иначе би била двусмислена.
Използвайте името на виртуалната таблица excluded
за препратка към входния ред. Но вероятно искате да се обърнете към целевата колона, така че се класифицирайте с името на целевата таблица:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
Единичният ред от виртуалната входна таблица excluded
съдържа всички колони на целевата таблица, дори ако не са посочени в списъка с целеви колони на INSERT
или VALUES
изразяване. Така че двусмислието, което срещате, винаги е налице, независимо дали count
е насочено изрично или не.
Настрана:Колоните, пропуснати в списъка с целеви колони, по подразбиране са към съответната им колона DEFAULT
стойност, която е NULL
по подразбиране (NULL
е колоната по подразбиране DEFAULT
). Т.е. по подразбиране ще бъде NULL
във вашата настройка и 1
в моята подобрена настройка по-долу. И тригери на ниво ред BEFORE INSERT
(ако има такива).
Но нито едно от тези не важи за примера, тъй като се отнася за целта колона все пак.
За отбелязване е, че другите две екземпляри на името на колоната count
са недвусмислени (и следователно не изискват квалификация на таблица), тъй като могат да се отнасят само до целта таблица.
Вашата настройка може лесно да се повреди, докато колоната count
не е дефинирано NOT NULL
, като NULL + 1
все още е NULL
. Тази настройка би имала повече смисъл:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
Също така не използвам имена на CaMeL в кавички в моя пример. Вижте: