"Il riferimento alla colonna è ambiguo" quando si inserisce l'elemento nella tabella


16

Sto usando PostgreSQL come mio database. E ho bisogno di creare una voce nel database, e se è già esistente, basta aggiornare i suoi campi, ma uno dei campi dovrebbe essere aggiornato solo se non è impostato.

Ho usato le informazioni di questa domanda: /programming/13305878/dont-update-column-if-update-value-is-null , è abbastanza correlato a quello che ho.

Ho provato a utilizzare questa query, ma quando la eseguo, si verifica un errore con 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);

(i valori reali vengono sostituiti, ovviamente).

Se sostituisco affiliate_code = COALESCE(affiliate_code, value3)con affiliate_code = value3, tutto funziona, no, ma nel modo in cui voglio farlo funzionare.

Come posso farlo funzionare?

Ecco come viene definita la mia tabella:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);

4
Prova = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Risposte:


16

Dai documenti,

conflitti_azione specifica un'azione ON CONFLICT alternativa. Può essere DO NOTHING o una clausola DO UPDATE che specifica i dettagli esatti dell'azione UPDATE da eseguire in caso di conflitto. Le clausole SET e WHERE in ON CONFLICT DO UPDATE hanno accesso alla riga esistente utilizzando il nome della tabella (o un alias) e alle righe proposte per l'inserimento utilizzando la tabella esclusa speciale. Il privilegio SELECT è richiesto su qualsiasi colonna della tabella di destinazione in cui vengono lette le colonne escluse corrispondenti.

Quindi, prova questo per 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.