Anda perlu membuat tabel-memenuhi syarat kolom di mana itu akan menjadi ambigu.
Gunakan nama tabel virtual excluded untuk merujuk ke baris input. Tetapi Anda mungkin ingin merujuk ke kolom target, jadi sesuaikan dengan nama tabel target:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
Baris tunggal dari tabel input virtual excluded berisi semua kolom tabel target, meskipun tidak tercantum dalam daftar kolom target INSERT atau VALUES ekspresi. Jadi ambiguitas yang Anda temui selalu ada, apakah count ditargetkan secara eksplisit atau tidak.
Selain:Kolom yang dihilangkan dalam daftar kolom target default ke kolomnya masing-masing DEFAULT nilai, yaitu NULL secara default (NULL menjadi kolom default DEFAULT ). Yaitu, defaultnya adalah NULL di pengaturan Anda dan 1 dalam pengaturan saya yang ditingkatkan di bawah ini. Dan pemicu tingkat baris BEFORE INSERT (jika ada) diterapkan.
Tapi tak satu pun dari itu berlaku untuk contoh karena mengacu pada target kolom.
Khususnya, dua contoh lain dari nama kolom count tidak ambigu (dan karenanya tidak memerlukan kualifikasi tabel) karena hanya dapat merujuk ke target tabel.
Pengaturan Anda dapat dengan mudah rusak saat kolom count tidak didefinisikan NOT NULL , sebagai NULL + 1 masih NULL . Penyiapan ini akan lebih masuk akal:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
Juga tidak menggunakan nama kasus CaMeL yang dikutip dalam contoh saya. Lihat: