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

Postgresql, perbarui atau sisipkan berdasarkan kasus

Saya juga ingin melakukan ini, setelah melihat ke dalamnya dan sedikit coba-coba, saya menemukan solusi yang berfungsi ini.

gunakan with pernyataan

with
u as (
  update my_table
    set some_value = $2
  where
    id = $1
  returning *
)
,
i as (
  insert into my_table (id, some_value)
    select $1, $2
  where 
    not exists(select * from u)
  returning *
)

select * from u
union
select * from i;

Coba pembaruan terlebih dahulu mengembalikan baris yang diperbarui, jika tidak ada baris yang dikembalikan dari pembaruan, lalu masukkan baris yang mengembalikan baris yang disisipkan. Kemudian pilih gabungan dari nilai yang dikembalikan dari pembaruan dan penyisipan, karena hanya satu yang akan terjadi, Anda hanya akan mendapatkan satu baris yang dikembalikan.

Semoga membantu



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kelola Pengumpulan Koneksi di aplikasi web multi-penyewa dengan Spring, Hibernate, dan C3P0

  2. Rake spec gagal sebagian besar tes, tetapi Rails berfungsi dengan baik pada sumber Diaspora

  3. Bagaimana cara mengurai string pencarian pengguna untuk kueri Postgresql?

  4. KUNCI UTAMA Gabungan memberlakukan batasan NOT NULL pada kolom yang terlibat

  5. Postgres 9.5 PADA KONFLIK LAKUKAN PILIH