«La référence de colonne est ambiguë» lors de l'insertion d'un élément dans le tableau

16

J'utilise PostgreSQL comme base de données. Et je dois créer une entrée dans la base de données, et si elle existe déjà, il suffit de mettre à jour ses champs, mais l'un des champs ne doit être mis à jour que s'il n'est pas défini.

J'ai utilisé les informations de cette question: /programming/13305878/dont-update-column-if-update-value-is-null , c'est assez lié à ce que j'ai.

J'ai essayé d'utiliser cette requête, mais lorsque je l'exécute, elle génère une erreur avec 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);

(les valeurs réelles sont remplacées, bien sûr).

Si je remplace affiliate_code = COALESCE(affiliate_code, value3)par affiliate_code = value3, tout fonctionne, mais pas de la façon dont je veux que cela fonctionne.

Comment puis-je faire fonctionner cela?

Voici comment ma table est définie:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);
serge1peshcoff
la source
4
Essayez = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Réponses:

16

Depuis les documents,

conflict_action spécifie une autre action ON CONFLICT. Il peut s'agir soit de DO NOTHING, soit d'une clause DO UPDATE spécifiant les détails exacts de l'action UPDATE à effectuer en cas de conflit. Les clauses SET et WHERE de ON CONFLICT DO UPDATE ont accès à la ligne existante en utilisant le nom de la table (ou un alias) et aux lignes proposées pour l'insertion à l'aide de la table spéciale exclue. Le privilège SELECT est requis sur n'importe quelle colonne de la table cible où les colonnes exclues correspondantes sont lues.

Au lieu de cela, essayez ceci par 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
la source