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


15

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: /programming/13305878/dont-update-column-if-update-value-is-null , es hängt ziemlich mit dem zusammen, was ich habe.

Ich habe versucht, diese Abfrage zu verwenden, aber wenn ich sie ausführe, tritt ein Fehler auf mit 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);

(Die realen Werte werden natürlich ersetzt).

Wenn ich ersetzen affiliate_code = COALESCE(affiliate_code, value3)mit affiliate_code = value3, alles funktioniert, aber nicht in der Art und Weise möchte ich es an der Arbeit.

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

4
Versuchen Sie es = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
Ypercubeᵀᴹ

Antworten:


15

Aus den Dokumenten,

konflikt_action 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 SET- und WHERE-Klauseln 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 werden. Das SELECT-Privileg ist für jede Spalte in der Zieltabelle erforderlich, 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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.