Preciso atualizar uma tabela de outra e preciso atualizar todas as colunas. Além de listar todas as colunas da SET
cláusula, existe uma maneira de atualizá-las todas de uma vez? Como isso:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
Eu tentei no psql, não funciona. Eu tenho que listar todas as colunas como esta:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
tableB
é criado, use create .. like tableA
. Então eles são basicamente idênticos. E a razão pela qual estou fazendo isso é que preciso carregar dados .csv em uma tabela temporária tableB
e atualizar com tableA
base nos novos dados do tableB
. tableA
precisa ser bloqueado o menos possível e tableA
precisa manter a integridade. Não tenho certeza 'excluir e inserir' seria uma boa opção?
postgresql
update
odieatla
fonte
fonte
Respostas:
Não há variante de sintaxe que permita atualizar a linha inteira de uma só vez. No entanto, existe uma forma mais curta do que a que você tem até agora.
Além disso, você realmente não deseja atualizar todas as colunas. A
WHERE
condição nos pinos de identificação pressiona pelo menos uma coluna (id
) para permanecer inalterada. Mas isso é apenas nitpicking.Mais detalhes nesta resposta relacionada:
Atualização em massa de todas as colunas
DELETE / INSERT
Internamente, devido ao modelo MVCC do Postgres , todos
UPDATE
efetivamente inserem uma nova linha de qualquer maneira e marcam a antiga como obsoleta. Portanto, por trás das cortinas, não há muita diferença entreUPDATE
eDELETE
maisINSERT
.Existem alguns detalhes a favor da
UPDATE
rota:Caso contrário, o bloqueio deve ser praticamente o mesmo. Você precisa de um bloqueio exclusivo nas linhas afetadas de qualquer maneira. Apenas seja rápido.
Se você estiver lidando com um grande número de linhas e não precisar de um estado consistente (todas as linhas ou nenhuma), poderá dividir a operação em vários lotes. (Transações separadas!) Aumenta o custo total, mas reduz o tempo de bloqueio por linha.
fonte
DELETE / INSERT
também pode ter efeitos indesejados ou apenas diferentes (em cascata ou disparados) que osUPDATE
.