Necesito actualizar una tabla de otra, y necesito actualizar todas las columnas. Además de enumerar todas las columnas de la SETcláusula, ¿hay alguna forma de actualizarlas todas a la vez? Me gusta esto:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.idLo 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.idtableBSe 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 tableBy luego actualizarlos en tableAfunción de los nuevos datos tableB. tableAnecesita ser bloqueado lo menos posible y tableAdebe 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
WHEREcondició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 / INSERTInternamente, debido al modelo MVCC de Postgres , cada uno
UPDATEinserta efectivamente una nueva fila y marca la antigua como obsoleta. Entonces, detrás de las cortinas no hay mucha diferencia entreUPDATEyDELETEmásINSERT.Hay algunos detalles a favor de la
UPDATEruta: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 / INSERTtambién puede tener efectos no deseados o simplemente diferentes (en cascada o disparados) que elUPDATE.