Necesito actualizar una tabla de otra, y necesito actualizar todas las columnas. Además de enumerar todas las columnas de la SET
cláusula, ¿hay alguna forma de actualizarlas todas a la vez? Me gusta esto:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
Lo intenté en psql, no funciona. Tengo que enumerar cada columna de esta manera:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
tableB
Se crea uso create .. like tableA
. Entonces son básicamente idénticos. Y la razón por la que lo hago es que necesito cargar datos .csv en una tabla temporal tableB
y luego actualizarlos en tableA
función de los nuevos datos tableB
. tableA
necesita ser bloqueado lo menos posible y tableA
debe mantener la integridad. No estoy seguro de que 'eliminar y luego insertar' sea una buena opción.
postgresql
update
odieatla
fuente
fuente
Respuestas:
No hay variante de sintaxis que le permita actualizar toda la fila a la vez. Sin embargo, hay una forma más corta que la que tienes hasta ahora.
Además, en realidad no desea actualizar todas las columnas. La
WHERE
condición en la identificación fija al menos una columna (id
) para permanecer sin cambios. Pero eso es solo una trampa.Más detalles en esta respuesta relacionada:
actualización masiva de todas las columnas
DELETE / INSERT
Internamente, debido al modelo MVCC de Postgres , cada uno
UPDATE
inserta efectivamente una nueva fila y marca la antigua como obsoleta. Entonces, detrás de las cortinas no hay mucha diferencia entreUPDATE
yDELETE
másINSERT
.Hay algunos detalles a favor de la
UPDATE
ruta:De lo contrario, el bloqueo debería ser casi igual. Necesita un bloqueo exclusivo en las filas afectadas de cualquier manera. Solo hazlo rápido.
Si está tratando con una gran cantidad de filas y no necesita un estado consistente (todas las filas o ninguna), puede dividir la operación en varios lotes. (¡Transacciones separadas!) Aumenta el costo total, pero mantiene el tiempo de bloqueo por fila más corto.
fuente
DELETE / INSERT
también puede tener efectos no deseados o simplemente diferentes (en cascada o disparados) que elUPDATE
.