"Посилання стовпця неоднозначне", коли вставляєте елемент у таблицю


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
);

4
Спробуйте = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Відповіді:


16

З документів,

запуск конфлікту вказує альтернативну дію НА КОНФЛІКТУ. Це може бути або НЕ НІЩО, або пункт ДОПОЗНІТЬ, що вказує точні деталі дії ОНОВЛЕННЯ, які слід виконати у випадку конфлікту. Указання 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.