Diberikan:
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)
);
Kueri ini:
insert into table_b (pk_b, b)
select pk_a,a from table_a
on conflict (b) do update set b=a;
menyebabkan kesalahan berikut:
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.
Bagaimana melakukan pembaruan sambil merujuk ke konten table_a
?
postgresql
postgresql-9.5
upsert
Tony Indrali
sumber
sumber
CREATE TABLE A...
membuat tabela
, bukantable_a
.do update set b = a;
tidak dapat menemukan "a" karena ada referensi Table "b" dan tidak ke Subquery, cobalahdo update set b = (select a from a);
Jawaban:
Berbagai masalah.
Pengaturan Anda, diperluas:
Ini bekerja:
Hasil:
Masalah
Anda membingungkan
table_a
danA
dalam demo Anda (seperti komentar @Abelisto ).Menggunakan pengidentifikasi legal, huruf kecil, tanda kutip membantu menghindari kebingungan.
Seperti @Ziggy yang disebutkan ,
ON CONFLICT
hanya berfungsi untuk pelanggaran batasan unik atau pengecualian . Manual:Akibatnya,
tidak bisa bekerja, tidak ada kendala di sana.ON CONFLICT (b)
ON CONFLICT (pk_b)
bekerja.Seperti @Ziggy juga disebutkan , nama tabel sumber tidak terlihat di
UPDATE
bagian itu. Manual:Penekanan berani saya.
Anda juga tidak bisa menggunakan nama kolom dari tabel sumber di
UPDATE
bagian tersebut. Itu harus nama kolom dari baris target . Jadi, Anda benar-benar ingin:Manual sekali lagi:
sumber
b = excluded.a
tidak bisa bekerja, itu sedikit tersembunyi di Docu resmi.Saat melakukan upserts di PostgreSQL 9.5+ Anda harus merujuk ke data yang dikecualikan (yang gagal disisipkan) oleh alias
excluded
. Selain itu,on conflict
opsi harus merujuk pada kunci:(pk_b)
daripada(b)
. Misalnya.Untuk informasi lebih lanjut lihat dokumentasi resmi atau pengantar yang mudah ini .
sumber