MySql
UPDATE a partir de um SELECT, JOIN

Em outro artigo, já mostramos como fazer INSERT a partir de um SELECT. Hoje iremos abordar UPDATE a partir de um SELECT, utilizando até mesmo a instrução JOIN. Atualização de dados é uma das tarefas mais importantes quando você trabalha com bancos de dados. Neste tutorial, você vai aprender como usar instrução UPDATE para atualizar dados em tabelas de banco de dados MySQL
Introdução ao MySQL instrução UPDATE
A instrução UPDATE é usada para atualizar os dados existentes nas tabelas. Ela pode ser usada para alterar os valores de coluna de uma única linha, um grupo de linhas ou todas as linhas da tabela.
O seguinte ilustra a sintaxe instrução UPDATE MySQL:
UPDATE [LOW_ PRIORITY] [IGNORE] table_name [, table_name...] SET column_name1 = expr1 [, column_name2=expr2 ...] [WHERE condition]
Vamos examinar a instrução UPDATE em maiores detalhes:
Seguido pela palavra-chave UPDATE é o nome da tabela que você deseja atualizar os dados. No MySQL, você pode alterar os dados de várias tabelas usando uma única instrução UPDATE. Se a instrução UPDATE viola qualquer restrição de integridade, o MySQL não irá realizar a atualização e emitirá uma mensagem de erro.
- A cláusula SET determina os nomes das colunas da tabela e os novos valores. Os novos valores podem ser valores literais, resultado de expressões ou subconsultas.
- A cláusula WHERE determina quais linhas serão atualizadas. É um elemento opcional da instrução UPDATE. Se a cláusula WHERE é omitida, todas as linhas da tabela será atualizada.
- A cláusula WHERE é tão importante que você não deve esquecer. Às vezes, você pode querer mudar apenas uma linha da tabela; se você esquecer a cláusula WHERE, a instrução UPDATE irá atualizar todas as linhas, o que não é o que você esperava.
Com a palavra-chave LOW_PRIORITY, a execução de UPDATE e atrasada até que nenhum outro cliente esteja lendo a tabela. Isso afeta apenas os mecanismos de armazenamento que usam apenas bloqueio em nível de tabela (como MyISAM, memória e MERGE).
Com a palavra-chave IGNORE, a instrução não irá abortar, mesmo se ocorrerem erros durante a atualização.
- Linhas para as quais os conflitos de chave duplicada ocorrem em um valor de chave única não são atualizadas.
- Linhas atualizadas com os valores que poderiam causar erros de conversão de dados, são atualizados para os valores válidos em vez dos mais próximos.
Exemplos de comandos UPDATE no MySQL
Vamos praticar com um par de exemplos no banco de dados exemplo MySQL.
UPDATE para atualizar uma única coluna em uma tabela
Neste exemplo, vamos atualizar o e-mail de Fulano de Tal para o novo email: fulano.de.tal@provedor.com.
Em primeiro lugar, para se certificar de que nós atualizamos o e-mail com sucesso, consultamos o e-mail de Fulano de Tal usando a instrução SELECT da seguinte forma:
SELECT firstname, lastname, email FROM colaborador WHERE idColab = 1056
Em segundo lugar, podemos atualizar seu e-mail atual para o novo e-mail fulano.de.tal.silva@provedor.com a instrução UPDATE como a seguinte consulta:
UPDATE colaborador SET email = ‘fulano.de.tal.silva@provedor.com’ WHERE idColab = 1056
Porque nós só queremos atualizar o registro de Fulano, por isso usamos a cláusula WHERE para especificar registro ID dele que é 1056. A cláusula SET define o valor da coluna de e-mail para o novo e-mail.
Em terceiro lugar, nós executamos a instrução SELECT novamente para verificar a mudança:
SELECT firstname, lastname, email FROM colaborador WHERE idColab = 1056
É possível atualizar vários registros fazendo a junção de tabelas?
Sim, isso é perfeitamente possível. Observe que para fazer a junção é necessário que haja um campo em comum entre as duas, ou seja, um campo que faça a ligação de uma tabela com a outra.
E como ficaria a sintaxe deste comando?
UPDATE TABELA a JOIN TABLEB b ON a.colA = b.colB SET a.columnToUpdate = [VALOR]
Examinando a instrução UPDATE acima em maiores detalhes, temos:
- Logo após a instrução UPDATE, temos a tabela principal que será atualizada.
- Abaixo, temos a junção de outra tabela, onde utilizamos a instrução JOIN, juntando a tabela A com a B de acordo que as duas tenham a mesma chave. Este JOIN pode ser; INNER, LEFT, RIGHT, ETC...depende da sua necessidade e entendimento, mas isso é assunto para outro artigo.
- E finalmente o SET que determina os nomes das colunas da tabela e os novos valores. Lembrando que os novos valores podem ser valores literais, números, resultado de expressões ou subconsultas.
E fazer atualização dos registros a partir de um SELECT, também é possível?
Sim, isso também é possível. O importante para este tipo de procedimento é prestar bem atenção nos nomes dos campos da tabela e mais, na sequência das informações. Elas precisam estar na mesma ordem para que não haja problemas, senão podem ocorrer erros, ou pior, trocar a ordem das informações, veja:
UPDATE TABELA_A SET CAMPO1 = ( SELECT CAMPO_TABELA_B FROM TABELA_B WHERE id = [VALOR] )
Perceba que na TABELA B, foi solicitado somente um campo, sendo este campo o valor que eu quero obter. Se eu errar e colocar uma coluna qualquer, pode haver erro, mas somente se os tipos de dados forem diferentes. Portanto nesse passo é preciso prestar atenção para buscar os dados que realmente deseja.
Consigo fazer o UPDATE com JOIN?
Podemos fazer quase tudo que imaginamos, basta pesquisar e sempre tomar cuidado com instruções novas. Sempre é bom fazer um BACKUP antes fazer testes, principalmente com comandos que ainda não temos domínio e, pode ter certeza, mesmo tendo domínio, uma distração você pode botar tudo a perder e ter uma enorme dor de cabeça, portanto sempre é bom ter um BACKUP, fica a dica.
E a SINTAXE para atualizar os registros com junção de tabelas ficaria da seguinte forma:
update TABELA_A a inner join TABELA_B b on a.ID_A = b.ID_B set a.CAMPO1 = [VALOR], a.CAMPO2 = [VALOR], a.CAMPO3 = [VALOR] WHERE b.CAMPO_TABELA_B = [VALOR]
Estamos atualizando a TABELA A, onde a TABELA B tenha um campo em comum com A e utilizando o SET para determinar os nomes das colunas da tabela e os novos valores, restringindo os valores de acordo com a intrução WHERE, onde somente serão atualizados os registros com valores que sejam iguais a TABELA B.
Perceba também, que logo após o nome da tabela tem um PREFIXO, ou seja, podemos dar um nome qualquer para ela, onde a partir deste momento sempre que precisarmos nos referir a ela, basta usarmos o PREFIXO (a, b, etc...)
Faça testes, mas lembre-se, sempre fazendo BACKUP antes para não perder seus dados, sejam eles de qualquer importância.
Neste tutorial, você aprendeu como usar a instrução UPDATE do MySQL para atualizar dados em tabelas de banco de dados de várias formas. Assim terminamos mais um artigo. Dúvidas, críticas ou sugestões comentem abaixo. =)
Gigasystems Login:
Informe seu e-mail abaixo para continuar!
XVeja Também:
Artigos Relacionados a categoria: MySql
Backup e Restore do banco de dados Mysql
03 July de 2015
Formatando datas no MySql com DATE_FORMAT()
20 March de 2015
SQL_CACHE otimizando suas consultas SQL do MySql
20 March de 2015
SQL Stored Procedures e Fucntions com Mysql
30 November de 2014
Olá, deixe seu comentário para UPDATE a partir de um SELECT, JOIN
Nilton Oliveira
tb_users (id, name_users, cpf, data, statu_id)
tb_status (id, name_status)
Patricia Forgiarini
É possível inserir mais de uma join, e este join ser com uma terceira tabela?
Ex.:
update tabela 1
join tabela 2 on (campo.t1 = campo.t2)
join tabela 3 on (campo.t2 =campo.t3)
Mark Damon
Até aqui funciona, porém o resultado sai na coluna temporária ColunaCalculoIdade, quero que o resultado atualizar os campo da coluna idade.
ja tentei usar assim: UPDATE clientes SET idade= SELECT TIMESTAMPDIFF(YEAR, data_nasc, CURRENT_DATE) AS ColunaCalculoIdade FROM clientes Só queria que o resultado de calculo da data de nascimento atualizasse minha coluna idade.
Álvaro Pagliari
jacqueline carvalho
Airton rocha
eu gostaria de fazer uma atualização em um código que se repete varias vezes em um campo, como eu faço para fazer essa substituição em massa? ex: Campo 1, campo 2 .... = A e gostaria de mudar para todos com o Código B
RAIMUNDO BARROSO
Afane Momade
Mary DelBrollo
"UPDATE minha_tabela SET Campo1='NULL' WHERE id='$id' and Campo1='$campo' ";
Até aqui funciona, porém preciso fazer este mesmo update também no Campo2, Campo3, Campo4... Campo16. É possível fazer isso em uma única instrução? Já tentei assim, mas não funcionou:
"UPDATE minha_tabela SET Campo1='NULL' WHERE id='$id' and Campo1='$campo' ";
"UPDATE minha_tabela SET Campo2='NULL' WHERE id='$id' and Campo2='$campo' ";
etc...
Alguém pode me dar uma luz? Só lembrando que sou novata em php, ok?
Obrigada!
Vinicius Luna
multiple rows in singleton select.
Alex Gusmao
UPDATE wp_posts p
JOIN wp_postmeta m ON p.ID = m.post_id
SET p.post_content= concat(p.post_title,'[gallery link="file" ids="',m.meta_value,'"]')
wHERE p.post_type='post'
AND p.post_status='publish'
AND m.meta_key='_thumbnail_id'
kelson magalhaes
possuou o regsitro 12345612345 e após a 6 casa preciso enserir o . "Ponto"
123456.12345
Leandro Viana
Eu gostaria de fazer a alteração em uma coluna de uma tabela, desde que o primeiro número de outra coluna começe com um determinado número. Exemplo
Altere a coluna tipo para d somente quando a coluna número_da_conta for começar com 2;
É possível?
Roberto Ribeiro
UPDATE `tabela1`
SET `tipo` = 'd'
WHERE
SUBSTR(`número_da_conta`,1) = '2';
Espero ter ajudado. :)