Por diversas vezes ao desenvolver determinada função de um sistema precisamos criar um registro ou alterar seu valor caso o registro já exista, para realizar esta operação � s vezes criamos um código relativamente grande e inútil. Isso por que, quando não criamos uma gambiarra ou como eu gosto de chamar “POGramação das boas” criamos um formulário para cadastrar e outro para atualizar.
Parando para analisar o código e codificando menos e pensando mais poderíamos realizar o procedimento de cadastrar e atualizar dados em um único formulário, até por que, normalmente os campos são os mesmos, esta operação pode ser facilitada usando a função REPLACE do MySQL.
Podemos utilizar a função REPLACE para realizar os dois procedimentos (inserção e atualização). A função REPLACE substitui um valor por outro, sendo assim, sempre que você informar um valor existente o MySQL irá apagá-lo e criar outro para substituí-lo. Para melhorar o entendimento vamos “desenhar”, ilustrado sempre é mais fácil.
| ID | NOMEUSUARIO |
| 1 | John |
| 2 | Fádylla |
| 3 | Rones |
Só um detalhe meu nome é John-Henrique (é com o hifém mesmo), sendo assim, vamos atualizar o registro com id 1 para o valor correto usando REPLACE, deixando de ser “John” e passando a ser “John-Henrique”.
REPLACE INTO tabelaUsuario (id, nomeUsuario) VALUES (1, ‘John-Henrique’);
Observe que informei o nome de todos os campos da tabela e todos os valores que preciso trabalhar, note que no parâmetro VALUES eu informei o número que corresponde ao id do registro a ser atualizado, e é isso que permite a atualização. Se o id do registro informado não existir REPLACE irá criar um novo registro com o id informado
Com isso nossa tabela ficaria assim
| ID | NOMEUSUARIO |
| 1 | John-Henrique |
| 2 | Fádylla |
| 3 | Rones |
Agora vamos imaginar que eu precise criar um novo registro, vejamos como criar um registro usando REPLACE.
REPLACE INTO tabelaUsuario (id, nomeUsuario) VALUES (NULL, ‘Cássia’);
Observe que informei todos os campos da tabela e deixei nulo o valor correspondente ao ID, também poderia fazer assim:
REPLACE INTO tabelaUsuario (id, nomeUsuario) VALUES (‘’, ‘Cássia’);
Desta forma teríamos criado um novo registro e nossa tabela estaria assim
| ID | NOMEUSUARIO |
| 1 | John-Henrique |
| 2 | Fádylla |
| 3 | Rones |
| 4 | Cássia |
Esta função é bastante útil, mas, ainda não acabou tem mais. Além de permitir cadastrar e atualizar registros ela também permite saber qual foi o procedimento realizado através da quantidade de registros afetados na consulta.
Quando o valor de registros afetados for 2 significa que fora realizado um processo de atualização, é uma questão de lógica também, como eu havia dito no inicio REPLACE substitui um registro existente, sendo assim, existia um registro e foi atualizado, por isso a atualização com REPLACE afeta dois registros.
Quando o valor de registros afetados for 1 significa que fora criado um novo registro, também é questão de lógica, não havia registro então foi criado um.
Mais informações sobre:
REPLACE
MySQL REPLACE, INSERT e UPDATE unidos
MYSQL_AFFTED_ROWS
Registros afetados na consulta
Compare Preços de: MySQL, MP3, iPod, celulares, notebooks, câmeras no JáCotei.
| Ofertas válidas até a meia noite de hoje | ![]() 26.000 Modelos Web Sites Editáveis Xhtml Php Psd Flash Asp Mais info» R$ 28.00 até 18x de 2.10 | ![]() Mega Total Scripts Portal Php Templates Modelos Sites Mais info» R$ 15.90 até 18x de 1.19 | ![]() Mega Total Scripts Portal Php Templates Modelos Sites Mais info» R$ 15.90 até 18x de 1.19 | ![]() 3000 Templates P Sites Joomla Boxedart Ultimatebox 15 Dvd Mais info» R$ 44.99 até 18x de 3.37 | ![]() Mega Total Scripts Portal Php Templates Modelos Sites Mais info» R$ 15.90 até 18x de 1.19 | ![]() Mega Total Scripts Portal Php Templates Modelos Sites Mais info» R$ 15.90 até 18x de 1.19 |
|---|---|---|---|---|---|
| Vitrine Tecnoblog |



muito bom
parabens
Posted by djulian | 18/06/2007, 08:01só não entendi por “melhore” no titulo? é apenas uma forma alternativa de cadastrar e alterar dados do mysql, não? Ou o uso do replace é mais rápido?? FalOU!
Posted by vinicius | 29/06/2007, 12:21Não é uma forma alternativa, mas, sim, uma forma abreviada de realizar INSERT(s) e UPDATE(s), em termos de desempenho ele seria mais ágil se comparado com o insert realizado da forma comum.
O motivo do título conter “melhore”, está diretamente relacionado ao fato de que você pode criar apenas um formulário e função de cadastro e utiliza-lo para realizar uma alteração (update) no registro, desta forma, teríamos menos códigos e um MELHOR desempenho no desenvolvimento.
Falopa!
Posted by John-Henrique | 29/06/2007, 13:32gostei da dica…realmente torna mais rapido a utilzação deste ao invés do update e do insert…mto bom !
Posted by daniel | 26/07/2007, 20:48Excelente dica, não conhecia essa função.
Abraço!
Posted by Thiago Rodrigues | 05/08/2007, 00:48O replace vai realizar um delete antes do insert. Isso vai gerar perda de performance..
Pra “melhorar” essa “POGmacao” ai vc deve usar o insert … on duplicate key update
Posted by Joao | 28/08/2007, 08:57@ JOÃO
O intuito deste artigo não é e nunca foi mostrar qual metodo tem a melhor performance, em todo caso, vamos analizar comigo…
O Replace irá tentar inserir (INSERT) um novo registro sempre a menos que a chave primária informada já exista, neste caso ele irá realizar um UPDATE.
O teu exemplo faz o que? Ele sempre tenta realizar um INSERT e caso haja uma chave primária existente ele realiza um UPDATE.
Agora me diga, qual dos dois tem melhor performance? Os dois realizam as mesmas ações a diferença é que um (replace) tem uma forma abreviada de ser escrito.
Falopa!
Posted by John-Henrique | 28/08/2007, 13:57Nao. Voce esta enganado. O desenvolvedor sempre deve ter performance em mente.
O replace vai -deletar- o registro e depois inserir novamente. No outro lado o insert on duplicate update vai desistir de inserir se ja existir um registro identico.
Lembre que o custo de um delete e’ muito alto por causa da reconstruicao dos indexes, portanto nunca deve ser executado em sistema de producao. Uma tecnica bem comum em sites com alto volume de delete e’ usar flags para deixar os dados invisiveis no site por um tempo pra depois deletar tudo de uma vez so e evitar o custo do delete.
e’ isso..
Posted by Joao | 30/08/2007, 11:17— citacao —
Quando o valor de registros afetados for 2 significa que fora realizado um processo de atualização, é uma questão de lógica também, como eu havia dito no inicio REPLACE substitui um registro existente, sendo assim, existia um registro e foi atualizado, por isso a atualização com REPLACE afeta dois registros.
— /citacao —
A quantidade de registros afetados ai e’ 2 pois ele realizou um -delete- no registro antigo e 1 -insert- pro registro novo. Me desculpe por pegar emprestado suas palavras mas.. isso é questão de lógica.
Posted by Joao | 30/08/2007, 23:05Só pra constar:
Essa solução é útil quando se quer atualizar TODOS os registros no caso de um já existe…
Digamos que eu queira alterar os dados de um usuário, sem alterar sua senha…
No momento em que eu executar o replace, ele irá deletar o registro e postar o novo que eu enviei. Logo, a senha irá voltar para a padrão e eu perderia essa informação.
Esta função só tem utilidade para casos muito específicos, e como foi dito acima, ela não realiza INSERÇÃO ou ATUALIZAÇÃO. O que ela realiza é INSERÇÃO ou REMOÇÃO+INSERÇÃO.
Posted by Rafagd | 25/10/2007, 13:55Gostei da Dica de se Usar Flags ao invés de deletar a tabela, vou usar em tabelas grandes agora. depois é soh colocar no Job pra executar de madrugada, vai ficar perfeito.!!
Grato
Thiago Feitosa
Posted by Thiago | 27/02/2008, 07:25Achei um jeito melhor de executar isso.
INSERT INTO () VALUES() ON DUPLICATE KEY UPDATE campo1 = “valor1″, campo2 = VALUES(campo2)/*novo valor*/, campo3 = campo3/*mantêm o antigo, mas pode omitir*/;
Posted by Rafagd | 27/02/2008, 09:34Você poderia reescrever o artigo mostrando como usar o INSERT INTO com DUPLICATE KEY UPDATE. Cara, você podia levar em consideração o gigantesco OVERHEAD para atualização de índices, que é o processo mais custoso que o banco de dados executa…
O replace tem sua utilidade, mas não neste contexto apresentado, não justifica.
Posted by Diego | 26/06/2008, 08:43@ DIEGO
Posso sim, mas infelizmente estou sem tempo para isso, apesar de que já foi citado em outro comentário como fazer com DUPLICATE KEY UPDATE e também o por que publiquei este artigo.
Falopa!
Posted by John-Henrique | 26/06/2008, 10:05Só consigo usar o REPLACE INTO com a senha de root. Como faço pra dar permissão para outros usuários executarem o comando REPLACE?
Valeu!
Posted by Leonardo | 02/07/2008, 08:28@ LEONARDO
Qual a versão do seu MySQL?
Você está testando no servidor local ou remoto (conta de hospedagem)?
Falopa!
Posted by John-Henrique | 02/07/2008, 09:05Essa dica foi fundamental pra mim. Tenho um volume de mais de 5800 registros novos por dia (e aumentando). Essa tabela tem 221 campos. Se não fosse o replace, eu teria que fazer um INSERT INTO () VALUES() ON DUPLICATE KEY UPDATE campo1 = “valor1″,…, campo221 = VALUES(campo221). Ninguém merece! Valeu!
Posted by Eduardo | 29/07/2008, 14:43A técnica da Flag é muito útil, principalmente quando vc trabalha com usuários que tem permissão e acidentalmente deletam informações importantes. Com a Flag de deletado ativada caso um problema desse acontecesse seria muito simples “recuperar” o registro.
abraço
Posted by Thiago Santos | 04/08/2008, 18:21O intuito deste artigo não é e nunca foi mostrar qual metodo tem a melhor performance, em todo caso, vamos analizar comigo…
O Replace irá tentar inserir (INSERT) um novo registro sempre a menos que a chave primária informada já exista, neste caso ele irá realizar um UPDATE.
O teu exemplo faz o que? Ele sempre tenta realizar um INSERT e caso haja uma chave primária existente ele realiza um UPDATE.
Agora me diga, qual dos dois tem melhor performance? Os dois realizam as mesmas ações a diferença é que um (replace) tem uma forma abreviada de ser escrito.
Posted by fabiano | 25/02/2009, 15:16Para usar o REPLACE INTO é necessário ter uma chave primária?
Posted by Juscelino Barão | 26/05/2009, 21:59@ JUSCELINO BARÃO
Como no artigo… Se você informar uma chave primária ele irá remover o registro e adicionar outro com o mesmo ID, se você não informar uma chave ele irá apenas adicionar um novo registro.
Falopa!
Posted by John-Henrique | 05/06/2009, 20:11Cara é o que eu estava precisando. PARABÉNS PELA DICA!
Posted by Benvindo | 05/07/2009, 12:06É possível com replace alterar dados de uma coluna específica?
como no Exemplo dado tenho os campos id, usuário, e agora um campo senha! É possível alterar o usuário e permancer a senha ou tenho que obrigatóriamente redigitar a senha para que tenha efeito?
Posted by Benvindo | 05/07/2009, 12:11@ BENVINDO
É possível sim, apenas deixe de informar os campos que não deseja alterar.
Falopa!
Posted by John-Henrique | 05/07/2009, 13:51Uso assim:
if (is_numeric($id)) $sql = update; else $sql = insert;
[]‘s
Posted by Carlos André Ferrari | 17/09/2009, 07:39Exatamente, vale lembrar e até merece voce editar o artigo e informar que o campo id precisa ser PRIMARY KEY se não ele não vai ser sobrescrito.
Já tive um má experiencia própria. rs
Posted by Julio Fagundes | 18/06/2010, 16:59