it-swarm.com.de

'Spaltenreferenz ist mehrdeutig' beim Einfügen eines Elements in eine Tabelle

Ich verwende PostgreSQL als meine Datenbank. Und ich muss einen Eintrag in der Datenbank erstellen, und wenn er bereits vorhanden ist, aktualisieren Sie einfach seine Felder, aber eines der Felder sollte nur aktualisiert werden, wenn es nicht festgelegt ist.

Ich habe Informationen aus dieser Frage verwendet: https://stackoverflow.com/questions/13305878/dont-update-column-if-update-value-is-null , es hängt ziemlich mit dem zusammen, was ich habe haben.

Ich habe versucht, diese Abfrage zu verwenden, aber wenn ich sie ausführe, tritt ein Fehler mit Column reference 'affiliate_code' is ambiguous Auf:

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

(Die realen Werte werden natürlich ersetzt).

Wenn ich affiliate_code = COALESCE(affiliate_code, value3) durch affiliate_code = value3 Ersetze, funktioniert alles, aber nicht so, wie ich es möchte.

Wie kann ich das zum Laufen bringen?

So ist meine Tabelle definiert:

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

Aus den Dokumenten,

Konflikt_Aktion gibt eine alternative ON CONFLICT-Aktion an. Dies kann entweder DO NOTHING oder eine DO UPDATE-Klausel sein, die die genauen Details der UPDATE-Aktion angibt, die im Falle eines Konflikts ausgeführt werden soll. Die Klauseln SET und WHERE in ON CONFLICT DO UPDATE haben Zugriff auf die vorhandene Zeile unter Verwendung des Tabellennamens (oder eines Alias) und auf Zeilen, die zum Einfügen unter Verwendung der speziellen ausgeschlossenen Tabelle vorgeschlagen wurden. Die Berechtigung SELECT ist für erforderlich Jede Spalte in der Zieltabelle, in der die entsprechenden ausgeschlossenen Spalten gelesen werden.

Versuchen Sie dies stattdessen pro 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);
16
Evan Carroll