Artigo: UPDATE a partir de um SELECT, JOIN - Gigasystems

MySql

Em por

update-a-partir-de-um-select-join
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

UPDATE a partir de um SELECT, JOIN

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. =)

Olá, deixe seu comentário para UPDATE a partir de um SELECT, JOIN

Já temos 14 comentário(s). DEIXE O SEU :)
Nilton Oliveira

Nilton Oliveira

Olá Marcos, como atualizar automaticamente o campo status de "Ativo" para "Inativo" do campo data numa tabela Mysql, na medida que a data é menor do que a data atual. Queria que ao abrir a página todos os dias fosse feita esta verificação e fizesse o update.

tb_users (id, name_users, cpf, data, statu_id)
tb_status (id, name_status)
★★★★★DIA 23.06.24 11h15RESPONDER
N/A
Enviando Comentário Fechar :/
Patricia Forgiarini

Patricia Forgiarini

Boa tarde!
É 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)
★★★★★DIA 08.05.23 16h59RESPONDER
N/A
Enviando Comentário Fechar :/
Mark Damon

Mark Damon

Tenho uma coluna chamada data_nasc e outra coluna idade, porém queria que toda vez que o sistema carregasse rodasse essa instrução dentro do MySQL e atualizasse o campo idade de todos os registros.

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.
★★★★★DIA 16.07.21 20h16RESPONDER
N/A
Enviando Comentário Fechar :/
Álvaro Pagliari

Álvaro Pagliari

UPDATE clientes SET idade= TIMESTAMPDIFF(YEAR, data_nasc, CURRENT_DATE)
★★★★★DIA 18.11.21 15h52RESPONDER
N/A
Enviando Comentário Fechar :/
jacqueline carvalho

jacqueline carvalho

Olá, é possível fazer um select join a partir de um case ?
★★★★★DIA 18.03.21 12h43RESPONDER
N/A
Enviando Comentário Fechar :/
Airton rocha

Airton rocha

Boa Tarde,
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
★★★★★DIA 09.12.20 18h18RESPONDER
N/A
Enviando Comentário Fechar :/
RAIMUNDO BARROSO

RAIMUNDO BARROSO

OLÁ! TENHO UM SISTEMA COM VÁRIAS TABELAS. DENTRE ESTAS TABELAS VERIFIQUEI QUE A TABELA_A E TABELA_B POSSUEM MUITOS CAMPOS IGUAIS (ID, COD_CLIENTE, NM_CLIENTE, ORIGEM_CLIENTE) PORÉM COM CONTEÚDOS DIFERENTES. A TABELA_A TEM NOMES QUE DEVERIAM SER IGUAIS AO DA TABELA_B, MAS SE DIFERENCIAM APENAS POR GRAFIAS, MUITAS VEZES ESCRITAS ERRADAS. OS CAMPOS COD_CLIENTE DE AMBAS AS TABELAS POSSUEM AS MESMAS INFORMAÇÕES . GOSTARIA DE PEGAR OS NOMES DA TABELA_A E SUBSTITUÍ-LOS TODOS COM MESMO COD_CLIENTE EM AMBAS AS TABELAS POR NOMES DA TABELA_B OS QUAIS POSSUEM ORIGEM_CLIENTE= ´diferenciado`
★★★★★DIA 26.07.20 09h45RESPONDER
N/A
Enviando Comentário Fechar :/
Afane Momade

Afane Momade

Muito obrigado, ajudou-me muito depois de tantas pesquisas.
★★★★★DIA 08.06.20 08h57RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Mary DelBrollo

Mary DelBrollo

Olá pessoal, blz? Estou precisando de um auxílio em um update aqui. Tenho uma tabela onde preciso atualizar para "NULL" apenas alguns campos de cada linha, mas com condições diferentes para cada campo. Por exemplo:
"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!
★★★★☆DIA 12.02.20 11h07RESPONDER
N/A
Enviando Comentário Fechar :/
Vinicius Luna

Vinicius Luna

UPDATE estoque SET estoque.teste = (SELECT est.qtoba FROM est) --omiti o where e apresentou o erro
multiple rows in singleton select.
★★★★★DIA 14.01.20 17h56RESPONDER
N/A
Enviando Comentário Fechar :/
Alex Gusmao

Alex Gusmao

o pessoal, ótimo artigo. Consegui utilizando o tutorial montar uma chamada para criar uma galeria automatizada em todos os meus posts publicados...



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'
★★★★★DIA 10.12.19 21h38RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
kelson magalhaes

kelson magalhaes

como atualizo um campo "update " em uma posição especifica tipo tenho o regsitro:
possuou o regsitro 12345612345 e após a 6 casa preciso enserir o . "Ponto"
123456.12345
★★★★★DIA 16.05.19 17h50RESPONDER
Marcio Sales
Enviando Comentário Fechar :/
Leandro Viana

Leandro Viana

Olá, boa noite.
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?
★★★★★DIA 08.03.19 00h09RESPONDER
N/A
Enviando Comentário Fechar :/
Roberto Ribeiro

Roberto Ribeiro

Olá Leandro Viana, é possível sim para tanto você precisa fazer uso da instrução substr() na cláusula where, exemplo:

UPDATE `tabela1`
SET `tipo` = 'd'
WHERE
SUBSTR(`número_da_conta`,1) = '2';


Espero ter ajudado. :)
★★★★★DIA 17.04.19 08h20RESPONDER
Marcos Martins, kelson magalhaes
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

Veja Também:

Artigos Relacionados a categoria: MySql

Soluções

...CURTIU? AINDA NÃO VIU NOSSO PORTFÓLIO?


Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite, veja agora mesmo nossos Cases de Sucesso e tenha seu site nos padrões atuais preparado para maioria dos dispositivos e navegadores.

Usamos cookies para manter o site seguro, registrar e personalizar sua navegação. Para mais detalhes sobre essa atividade, acesse nossa Politica de Privacidade

Entendi