Olá, pessoal!
É sabido que se pode efetuar insert's em uma tabela de acordo com o retorno do select de outra tabela, mas é possível fazer o mesmo com updates? É exatamente o que veremos neste post.
Antes de mais nada vamos relembrar rapidamente do script de udpdate. A sintaxe é como segue:
update tb_usuarios set nome = 'Fulano', idade = 29, cpf = '33399955577' where id_usuario = 100
Aqui atualizo três campos (nome, idade e cpf) na tb_usuarios onde o id_usuario é 100. Até então nenhuma novidade.
O MySQL não aceita trabalhar com uma cláusula select juntamente a um update.
Sendo assim, como já diz o ditado "a coisa é mais em baixo". A única alternativa que nos resta é o querido amigo INNER JOIN.
Efetuando um update ligando os campos da tabela do update com um inner join conseguimos então resgatar valores de uma outra tabela para atualizar a tabela que queremos.
Vejamos um exemplo:
update tb_logins l inner join tb_usuarios u on u.id_usuario = l.id_usuario set l.login = u.cpf, l.senha = sha1(u.cpf)
O objetivo do script acima é atualizar todos os logins e senhas (com criptografia SHA1) para o próprio cpf do usuário.
O que fiz foi basicamente ligar a tb_usuarios à tb_logins através de sua chave primária (id_usuario) e através do álias de cada tabela efetuo a configuração dos campos que desejo atualizar no set.
Lembrando que aqui também é possível efetuar filtros com where normalmente.
Por exemplo:
update tb_logins l inner join tb_usuarios u on u.id_usuario = l.id_usuario and u.id_usuario = 100 set l.login = u.cpf, l.senha = sha1(u.cpf)
Desta forma o script atualiza o login e senha apenas do usuário de id 100.