Gegeben:
CREATE TABLE A (
PK_A INT8 NOT NULL,
A INT8,
PRIMARY KEY (PK_A)
);
CREATE TABLE B (
PK_B INT8 NOT NULL,
B INT8,
PRIMARY KEY (PK_B)
);
Diese Abfrage:
insert into table_b (pk_b, b)
select pk_a,a from table_a
on conflict (b) do update set b=a;
verursacht den folgenden Fehler:
ERROR: column "a" does not exist LINE 1: ...elect pk_a,a from table_a on conflict (b) do update set b=a; ^ HINT: There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query.
Wie mache ich das Update unter Bezugnahme auf den Inhalt von table_a
?
postgresql
postgresql-9.5
upsert
Tony Indrali
quelle
quelle
CREATE TABLE A...
Tabelle erstellta
, nichttable_a
.do update set b = a;
nicht finden kann „a“ , weil es Bezugnahme auf die Tabelle „b“ und nicht auf die Subquery, versuchendo update set b = (select a from a);
Antworten:
Vielfache Probleme.
Dein Setup, erweitert:
Das funktioniert:
Ergebnis:
Die Probleme
Sie sind verwirrend
table_a
undA
in Ihrer Demo (wie @Abelisto kommentiert ).Die Verwendung von nicht in Anführungszeichen gesetzten Bezeichnern in Kleinbuchstaben hilft, Verwirrung zu vermeiden.
Wie @Ziggy bereits erwähnt ,
ON CONFLICT
funktioniert dies nur bei tatsächlichen Verstößen gegen eindeutige oder Ausschlussbedingungen . Das Handbuch:Folglich
kann dort keine Einschränkung funktionieren.ON CONFLICT (b)
ON CONFLICT (pk_b)
funktioniert.Wie @Ziggy erwähnte auch , Quellentabellennamen nicht sichtbar sind im
UPDATE
Teil. Das Handbuch:Meine kühne Betonung.
Sie können im Teil auch keine Spaltennamen der Quellentabelle verwenden
UPDATE
. Es muss Spaltennamen der Zielreihe . Sie wollen also wirklich:Das Handbuch noch einmal:
quelle
b = excluded.a
nicht funktioniert, es war ein bisschen im offiziellen Docu versteckt.Wenn Sie Upserts in PostgreSQL 9.5+ ausführen, müssen Sie sich auf die ausgeschlossenen Daten (die, die nicht eingefügt werden konnten) des Alias beziehen
excluded
. Dieon conflict
Option muss sich auch auf den Schlüssel beziehen:(pk_b)
anstatt(b)
. Z.B.Weitere Informationen finden Sie in der offiziellen Dokumentation oder in dieser einfachen Einführung zu upsert .
quelle