Öğeyi tabloya yükseltirken 'sütun başvurusu belirsiz'


16

Veritabanı olarak PostgreSQL kullanıyorum. Ve veritabanında bir giriş oluşturmak gerekir ve zaten varsa, sadece alanlarını güncelleyin, ancak alanlardan biri yalnızca ayarlanmadıysa güncelleştirilmelidir.

Bu sorudan bilgi kullandım: /programming/13305878/dont-update-column-if-update-value-is-null , sahip olduğum şeyle oldukça ilgili.

Bu sorguyu kullanmaya çalıştım, ancak çalıştırdığımda hata veriyor 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);

(gerçek değerler elbette ikame edilir).

Ben değiştirirseniz affiliate_code = COALESCE(affiliate_code, value3)ile affiliate_code = value3herşey eserler, bir şekilde ben işe istemem ama.

Bu işi nasıl yapabilirim?

Masamın nasıl tanımlandığı aşağıda açıklanmıştır:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);

4
Deneyin = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Yanıtlar:


16

Dokümanlardan,

conflict_action ÇATIŞMA eylem AÇIK alternatif belirtir. Bir çakışma durumunda gerçekleştirilecek UPDATE eyleminin ayrıntılarını belirten DO NOTHING veya DO UPDATE yan tümcesi olabilir. ON CONFLICT DO UPDATE içindeki SET ve WHERE yan tümceleri , tablonun adını (veya takma adı) kullanarak var olan satıra ve hariç tutulan özel tablo kullanılarak ekleme için önerilen satırlara erişebilir. Hedef tabloda karşılık gelen hariç tutulan sütunların okunduğu herhangi bir sütunda SELECT ayrıcalığı gerekir.

Bunun yerine, bunu ypercube başına deneyinᵀᴹ

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.