Başka bir tablodaki tüm sütunları güncelleme


13

Bir tabloyu diğerinden güncellemem gerekiyor ve tüm sütunları güncellemem gerekiyor. Maddedeki her sütunu listelemenin yanı sıra SET, hepsini bir kerede güncellemenin bir yolu var mı? Bunun gibi:

update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id

Ben psql denedim, çalışmıyor. Ben böyle her sütun listelemek zorunda:

update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id

tableBkullanım yaratılır create .. like tableA. Yani temelde aynılar. Ve bunu yapmamın nedeni, geçici tabloya .csv verilerini yüklemem tableBve ardından tableAyeni verilere dayanarak güncellemem gerektiğidir tableB. tableAmümkün olduğunca az kilitlenmesi ve tableAbütünlüğünün korunması gerekir. 'Sil sonra ekle' nin iyi bir seçenek olacağından emin değilim?


1
İkinci kodunuzla test ettim, işe yarıyor! İki konuyu gözden geçirmelisiniz : dba.stackexchange.com/questions/58371/… , dba.stackexchange.com/questions/59458/…
Luan Huynh

Yanıtlar:


12

Orada hiçbir seferde tüm satır güncellemenizi sağlar sözdizimi varyantı. Ancak, şimdiye kadar sahip olduğunuzdan daha kısa bir form var.

Ayrıca, aslında tüm sütunları güncellemek istemezsiniz. Kimlikteki WHEREkoşul, iddeğişmeden kalması için en az bir sütunu ( ) sabitler. Ama bu sadece çılgınca.

UPDATE table_a a
SET    (  c1,   c2, ...)
     = (b.c1, b.c2, ...)
FROM   table_b b
WHERE  a.id = b.id;

Bu yanıtta daha fazla ayrıntı:
Tüm sütunların toplu güncellenmesi

DELETE / INSERT

Dahili olarak, MVG Postgres modeli nedeniyle , her şey UPDATEetkili bir şekilde yeni bir satır ekler ve eskisini eski olarak işaretler. Yani, perdelerin arkasında UPDATEve DELETEartı arasında çok fazla fark yok INSERT. Rotanın lehine bazı detaylar
var : UPDATE

  • SICAK GÜNCELLEME.
  • TOAST tabloları: Büyük sütunlarınız varsa, içerik TOAST tablolarında "çevrimdışı" olarak depolanabilir ve kızarmış satırlar değişmeden kalırsa yeni satır sürümü TOAST tablosundaki aynı satıra bağlanabilir.
  • Dizin bakımı güncellemeler için daha ucuz olabilir.

Aksi takdirde, kilitleme hemen hemen aynı olmalıdır. Etkilenen satırlarda her iki şekilde de özel bir kilide ihtiyacınız vardır. Sadece çabuk yap.
Çok sayıda satırla uğraşıyorsanız ve tutarlı bir duruma (tüm satırlar veya hiçbiri) ihtiyacınız yoksa, işlemi birden fazla gruba bölebilirsiniz. (Ayrı işlemler!) Toplam maliyeti artırır, ancak satır başına kilitlenme süresini daha kısa tutar.


3
DELETE / INSERTayrıca istenmeyen veya sadece farklı (kademeli veya tetiklenen) etkilere sahip olabilir UPDATE.
ypercubeᵀᴹ

Doğru, ancak table_a'nın takma adı bölümünü güncellemelisiniz. table_a (güncellenmiş tablo) takma ad alamaz.
Sadece Başka Bir Kod Sevgilisi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.