Ich muss eine Tabelle von einer anderen aktualisieren, und ich muss alle Spalten aktualisieren. Gibt es neben der Auflistung aller Spalten in der SET
Klausel eine Möglichkeit, alle auf einmal zu aktualisieren? So was:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
Ich habe es in psql versucht, es funktioniert nicht. Ich muss jede Spalte so auflisten:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
tableB
Verwendung erstellt wird create .. like tableA
. Sie sind also im Grunde identisch. Der Grund dafür ist, dass ich CSV-Daten in eine temporäre Tabelle laden tableB
und dann tableA
basierend auf den neuen Daten in aktualisieren muss tableB
. tableA
muss so wenig wie möglich gesperrt werden und tableA
muss Integrität bewahren. Ich bin mir nicht sicher, ob "Löschen und dann einfügen" eine gute Option ist.
postgresql
update
odieatla
quelle
quelle
Antworten:
Es gibt keine Syntaxvariante, mit der Sie die gesamte Zeile auf einmal aktualisieren können. Es gibt jedoch eine kürzere Form als bisher.
Außerdem möchten Sie nicht alle Spalten aktualisieren. Die
WHERE
Bedingung an id setzt mindestens eine Spalte (id
) nach unten , um unverändert zu bleiben. Aber das ist nur eine Kleinigkeit.Weitere Details in dieser verwandten Antwort:
Massenaktualisierung aller Spalten
DELETE / INSERT
Intern fügt aufgrund des MVCC-Modells von Postgres jeder
UPDATE
effektiv eine neue Zeile ein und markiert die alte als veraltet. Hinter den Vorhängen gibt es also keinen großen Unterschied zwischenUPDATE
undDELETE
plusINSERT
.Es gibt einige Details für die
UPDATE
Route:Ansonsten sollte die Sperrung ungefähr gleich sein. In beiden Fällen benötigen Sie eine exklusive Sperre für betroffene Zeilen. Mach es einfach schnell.
Wenn Sie mit einer großen Anzahl von Zeilen arbeiten und keinen konsistenten Status benötigen (alle Zeilen oder keine), können Sie den Vorgang in mehrere Stapel aufteilen. (Separate Transaktionen!) Erhöht die Gesamtkosten, hält aber die Sperrzeit pro Zeile kürzer.
quelle
DELETE / INSERT
kann auch unerwünschte oder einfach andere (kaskadenartige oder ausgelöste) Effekte haben als dieUPDATE
.