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: