«Ссылка на столбец неоднозначна» при вставке элемента в таблицу

16

Я использую PostgreSQL в качестве базы данных. И мне нужно создать запись в базе данных, и если она уже существует, просто обновить ее поля, но одно из полей должно быть обновлено, только если оно не установлено.

Я использовал информацию из этого вопроса: /programming/13305878/dont-update-column-if-update-value-is-null , это очень связано с тем, что у меня есть.

Я пытался использовать этот запрос, но когда я его запускаю, он выдает ошибки Column reference 'affiliate_code' is ambiguous:

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(affiliate_code, value3);

(реальные значения подставляются, конечно).

Если я заменю affiliate_code = COALESCE(affiliate_code, value3)на affiliate_code = value3, все работает, но не так, как я хочу, чтобы это работало.

Как я могу сделать эту работу?

Вот как определяется моя таблица:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);
serge1peshcoff
источник
4
Попробуй = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Ответы:

16

Из документов,

Параметр конфликта_ указывает альтернативное действие ON CONFLICT. Это может быть либо DO НИЧЕГО, либо предложение DO UPDATE, в котором указаны точные детали действия UPDATE, которое должно быть выполнено в случае конфликта. Предложения SET и WHERE в ON CONFLICT DO UPDATE имеют доступ к существующей строке, используя имя таблицы (или псевдоним), и к строкам, предложенным для вставки, используя специальную исключенную таблицу. Привилегия SELECT требуется для любого столбца в целевой таблице, где читаются соответствующие исключенные столбцы.

Так что вместо этого, попробуйте это за ypercubeᵀᴹ

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(accounts.affiliate_code, excluded.affiliate_code);
Эван Кэрролл
источник