„Odwołanie do kolumny jest niejednoznaczne” podczas wstawiania elementu do tabeli

16

Używam PostgreSQL jako mojej bazy danych. I muszę utworzyć pozycję w bazie danych, a jeśli już istnieje, po prostu zaktualizuj jej pola, ale jedno z pól powinno zostać zaktualizowane tylko, jeśli nie jest ustawione.

Użyłem informacji z tego pytania: /programming/13305878/dont-update-column-if-update-value-is-null , jest to dość związane z tym, co mam.

Próbowałem użyć tego zapytania, ale po jego uruchomieniu występuje błąd 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);

(oczywiście wartości rzeczywiste są podstawiane).

Jeśli mogę wymienić affiliate_code = COALESCE(affiliate_code, value3)z affiliate_code = value3, wszystko działa, ale nie w taki sposób chcę go do pracy.

Jak mogę to zrobić?

Oto jak zdefiniowana jest moja tabela:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);
serge1peshcoff
źródło
4
Spróbować = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Odpowiedzi:

16

Z dokumentów

konflikt aktywności określa alternatywne działanie NA KONFLIKCIE. Może to być albo NIE NIC, albo klauzula DO UPDATE określająca dokładne szczegóły akcji UPDATE do wykonania w przypadku konfliktu. Klauzule SET i WHERE w ON CONFLICT DO UPDATE mają dostęp do istniejącego wiersza przy użyciu nazwy tabeli (lub aliasu) oraz do wierszy proponowanych do wstawienia przy użyciu specjalnej tabeli wykluczonej. Uprawnienie SELECT jest wymagane dla dowolnej kolumny w tabeli docelowej, w której czytane są odpowiednie wykluczone kolumny.

Zamiast tego spróbuj tego na 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);
Evan Carroll
źródło