PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Referensi kolom ambigu di INSERT ... ON CONFLICT DO UPDATE

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;

Manual:

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengguna Postgres membuat database

  2. Panggil fungsi pengembalian set dengan argumen array beberapa kali

  3. Postgresql :Tambahkan elemen dalam objek array json

  4. Bagaimana cara memulihkan satu tabel dari cadangan .sql postgresql?

  5. Postgres gagal dengan 'tidak dapat membuka file pemetaan relasi global/pg_filenode.map'