Usando update com inner join. (MySql)
Overview
Bem-vindo a uma jornada pelo mundo do SQL, onde a magia acontece em tabelas e colunas! Hoje, vamos desbravar como fazer um update com inner join de maneira simples e eficaz, usando um exemplo didático que, por mais que brinque com a ideia de uma ‘péssima arquitetura de banco’, promete entregar valor e um aprendizado sólido. Preparado para alinhar tabelas como um pro? Vamos nessa!
Imagine a situação: Você tem uma tabela com os dados de um produto e outra tabela com uma coluna complementar. As duas tabelas possuem um campo que pode (seguramente) ser utilizado como chave. Neste post mostro como criar um update com inner join, para que você possa atualizar uma das tabelas com os dados da outra.
Imagine a tabela PRODUTO:
- prod_id
- prod_nome
- prod_descricao
- prod_status
E a tabela PRODUTO_AUXILIAR:
- aux_id
- prod_id
- prod_status
Acho importante mencionar que estas tabelas só tem duas utilidades:
- Servir de exemplo neste post;
- Servir de exemplo de uma péssima arquitetura de banco 😛 ;
O que queremos é atualizar a coluna prod_status (da tabela produto) com a informação que consta na coluna prod_status da tabela produto_auxiliar onde o prod_id seja menor que 10. A coluna prod_id das duas tabelas pode ser utilizada como chave na ligação de um inner join.
Este é um update razoavelmente simples:
update PRODUTO p
inner join PRODUTO_AUXILIAR pa on p.prod_id = pa.prod_id
set p.prod_status = pa.prod_status
where p.prod_id < 10;
A sintaxe do inner join para o update é feita logo após a definição do nome da tabela que será atualizada.
Neste exemplo, se você quiser atualizar todos os registros da tabela produto com as informações da tabela produto_auxiliar, poderia simplesmente remover a clausula where, uma vez que o inner join vai “filtrar” as linhas afetadas.
Quer testar, mas não sabe se vai funcionar? Não seja –aquele estagiário–, utilize as transações:
- Utilize o comando START TRANSACTION;
- Faça os testes e confira os resultados;
- Utilize o commando ROLLBACK; (ou, se tudo der certo, o COMMIT;)
Espero ter ajudado!