Saya perlu memperbarui tabel dari yang lain, dan saya perlu memperbarui semua kolom. Selain mencantumkan setiap kolom dalam SET
klausa, apakah ada cara untuk memperbarui semuanya sekaligus? Seperti ini:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
Saya mencoba psql, tidak berhasil. Saya harus mendaftar setiap kolom seperti ini:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
tableB
dibuat digunakan create .. like tableA
. Jadi mereka pada dasarnya identik. Dan alasan saya melakukannya adalah karena saya perlu memuat data .csv ke tabel temp tableB
dan kemudian memperbarui tableA
berdasarkan data baru di tableB
. tableA
perlu dikunci sesedikit mungkin dan tableA
perlu menjaga integritas. Saya tidak yakin 'hapus lalu masukkan' akan menjadi opsi yang baik?
postgresql
update
odieatla
sumber
sumber
Jawaban:
Ada ada varian sintaks yang memungkinkan Anda memperbarui seluruh baris sekaligus. Namun, ada bentuk yang lebih pendek dari yang Anda miliki sejauh ini.
Selain itu, Anda sebenarnya tidak ingin memperbarui semua kolom. The
WHERE
kondisi pada pin id turun setidaknya satu kolom (id
) tetap tidak berubah. Tapi itu hanya nitpicking.Lebih detail dalam jawaban terkait ini:
Pembaruan massal semua kolom
DELETE / INSERT
Secara internal, karena model MVCC Postgres , bagaimanapun juga setiap
UPDATE
baris secara efektif menyisipkan baris baru dan menandai yang lama sebagai usang. Jadi, di balik gorden tidak ada banyak perbedaan antaraUPDATE
danDELETE
plusINSERT
.Ada beberapa detail yang mendukung
UPDATE
rute:Kalau tidak, pengunciannya harus hampir sama. Anda memerlukan kunci eksklusif pada baris yang terpengaruh. Cepat saja.
Jika Anda berurusan dengan sejumlah besar baris dan Anda tidak memerlukan status yang konsisten (semua baris atau tidak sama sekali), Anda dapat membagi operasi menjadi beberapa batch. (Transaksi terpisah!) Meningkatkan total biaya, tetapi mempersingkat waktu penguncian per baris.
sumber
DELETE / INSERT
mungkin juga memiliki efek yang tidak diinginkan atau hanya berbeda (kaskade atau dipicu) dariUPDATE
.