'Referensi kolom ambigu' saat memasukkan elemen ke dalam tabel

16

Saya menggunakan PostgreSQL sebagai basis data saya. Dan saya perlu membuat entri dalam database, dan jika sudah ada, perbarui saja bidangnya, tetapi salah satu bidang harus diperbarui hanya jika tidak disetel.

Saya telah menggunakan info dari pertanyaan ini: /programming/13305878/dont-update-column-if-update-value-is-null , ini cukup terkait dengan apa yang saya miliki.

Saya mencoba menggunakan kueri ini, tetapi ketika saya menjalankannya, ia salah dengan 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);

(nilai sebenarnya diganti, tentu saja).

Jika saya ganti affiliate_code = COALESCE(affiliate_code, value3)dengan affiliate_code = value3, semuanya berfungsi, tetapi tidak dengan cara yang saya inginkan berfungsi.

Bagaimana saya bisa membuat ini berfungsi?

Beginilah tabel saya didefinisikan:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);
serge1peshcoff
sumber
4
Coba = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Jawaban:

16

Dari dokumen,

konflik_aksi menentukan alternatif tindakan ON CONFLICT. Itu bisa berupa DO NOTHING, atau klausa DO UPDATE yang menentukan detail pasti dari tindakan UPDATE yang akan dilakukan jika terjadi konflik. Klausa SET dan WHERE di ON CONFLICT DO UPDATE memiliki akses ke baris yang ada menggunakan nama tabel (atau alias), dan ke baris yang diajukan untuk dimasukkan menggunakan tabel khusus yang dikecualikan. Hak istimewa SELECT diperlukan pada kolom mana saja di tabel target tempat kolom yang dikecualikan dibaca.

Jadi alih-alih, coba ini per 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);
Evan Carroll
sumber