J'ai besoin de mettre à jour une table à partir d'une autre et j'ai besoin de mettre à jour toutes les colonnes. Outre la liste de toutes les colonnes de la SET
clause, existe-t-il un moyen de les mettre à jour simultanément? Comme ça:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
J'ai essayé en psql, ça ne marche pas. Je dois lister chaque colonne comme ceci:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
tableB
est créé utiliser create .. like tableA
. Ils sont donc fondamentalement identiques. Et la raison pour laquelle je le fais est que je dois charger des données .csv dans une table temporaire tableB
, puis mettre à jour en tableA
fonction des nouvelles données dans tableB
. tableA
doit être verrouillé le moins possible et tableA
doit conserver son intégrité. Je ne suis pas sûr que «supprimer puis insérer» serait une bonne option?
postgresql
update
odieatla
la source
la source
Réponses:
Il n'y a aucune variante de syntaxe qui vous permet de mettre à jour la ligne entière à la fois. Cependant, il existe une forme plus courte que celle que vous avez jusqu'à présent.
En outre, vous ne souhaitez pas réellement mettre à jour toutes les colonnes. La
WHERE
condition sur l'ID épingle au moins une colonne (id
) pour rester inchangée. Mais c'est juste une piqûre.Plus de détails dans cette réponse connexe:
mise à jour en masse de toutes les colonnes
DELETE / INSERT
En interne, en raison du modèle MVCC de Postgres , chaque
UPDATE
insère effectivement une nouvelle ligne et marque l'ancienne comme obsolète. Donc, derrière les rideaux, il n'y a pas beaucoup de différence entreUPDATE
etDELETE
plusINSERT
.Il y a quelques détails en faveur de l'
UPDATE
itinéraire:Sinon, le verrouillage devrait être à peu près le même. Vous avez besoin d'un verrou exclusif sur les lignes affectées dans les deux cas. Faites vite.
Si vous traitez un grand nombre de lignes et que vous n'avez pas besoin d'un état cohérent (toutes les lignes ou aucune), vous pouvez diviser l'opération en plusieurs lots. (Transactions séparées!) Augmente le coût total, mais réduit le temps de verrouillage par ligne.
la source
DELETE / INSERT
peut également avoir des effets indésirables ou simplement différents (en cascade ou déclenchés) queUPDATE
.