Dany:
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)
);
To zapytanie:
insert into table_b (pk_b, b)
select pk_a,a from table_a
on conflict (b) do update set b=a;
powoduje następujący błąd:
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.
Jak wykonać aktualizację, odnosząc się do treści table_a
?
postgresql
postgresql-9.5
upsert
Tony Indrali
źródło
źródło
CREATE TABLE A...
tworzy tabelęa
, a nietable_a
.do update set b = a;
nie może znaleźć „a”, ponieważ istnieje odniesienie do tabeli „B”, a nie do podzapytania, spróbujdo update set b = (select a from a);
Odpowiedzi:
Wiele problemów.
Twoja konfiguracja rozszerzona:
To działa:
Wynik:
Problemy
Jesteś zagubiony
table_a
iA
na swoim demie (jak komentował @Abelisto ).Używanie legalnych, małych i niewymienionych identyfikatorów pomaga uniknąć nieporozumień.
Jak wspomniano w @Ziggy ,
ON CONFLICT
działa tylko w przypadku rzeczywistych naruszeń ograniczeń unikatowych lub wykluczających . Instrukcja:W związku z tym
nie może działać, nie ma ograniczeń.ON CONFLICT (b)
ON CONFLICT (pk_b)
Pracuje.Jak wspomniano również @Ziggy , nazwy tabel źródłowych nie są widoczne w
UPDATE
części. Instrukcja:Odważny nacisk moje.
W części nie można również używać nazw kolumn tabeli źródłowej
UPDATE
. Musi to być nazwa kolumny docelowego wiersza . Więc naprawdę chcesz:Instrukcja jeszcze raz:
źródło
b = excluded.a
nie działa, było to trochę ukryte w oficjalnym Docu.Podczas wykonywania aktualizacji w PostgreSQL 9.5+ musisz odwoływać się do wykluczonych danych (tych, których nie udało się wstawić) przez alias
excluded
. Ponadtoon conflict
opcja musi odnosić się do klucza:(pk_b)
zamiast(b)
. Na przykład.Aby uzyskać więcej informacji, zapoznaj się z oficjalną dokumentacją lub z tym łatwym wprowadzeniem do upsert .
źródło