MySQL REPLACE melhore seu INSERT e UPDATE

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

John-Henriquequarta-feira, 02/05/200727

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 [bp]MySQL[/bp].

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.

IDNOMEUSUARIO
1John
2Fádylla
3Rones

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

IDNOMEUSUARIO
1John-Henrique
2Fádylla
3Rones

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

IDNOMEUSUARIO
1John-Henrique
2Fádylla
3Rones
4Cá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

Termos relacionados:

  • replace mysql
  • mysql replace
  • replace into mysql
  • mysql REPLACE INTO
  • replace into
  • update replace mysql
  • mysql insert or update
  • insert replace
  • replace no mysql
  • update replace

Este post foi útil? Retribua clicando no botão


27 comentários »

  1. djulian segunda-feira, 18/06/2007 em 08:01 - Reply

    muito bom ;) parabens

  2. vinicius sexta-feira, 29/06/2007 em 12:21 - Reply

    só 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!

  3. John-Henrique sexta-feira, 29/06/2007 em 13:32 - Reply

    Nã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!

  4. daniel quinta-feira, 26/07/2007 em 20:48 - Reply

    gostei da dica…realmente torna mais rapido a utilzação deste ao invés do update e do insert…mto bom !

  5. Thiago Rodrigues domingo, 05/08/2007 em 00:48 - Reply

    Excelente dica, não conhecia essa função.
    Abraço!

  6. Joao terça-feira, 28/08/2007 em 08:57 - Reply

    O 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 :-P

  7. John-Henrique terça-feira, 28/08/2007 em 13:57 - Reply

    @ 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!

  8. Joao quinta-feira, 30/08/2007 em 11:17 - Reply

    Nao. 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..

  9. Joao quinta-feira, 30/08/2007 em 23:05 - Reply

    — 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.

    :P

  10. Rafagd quinta-feira, 25/10/2007 em 13:55 - Reply

    Só 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.

  11. Thiago quarta-feira, 27/02/2008 em 07:25 - Reply

    Gostei 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

  12. Rafagd quarta-feira, 27/02/2008 em 09:34 - Reply

    Achei 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*/;

  13. Diego quinta-feira, 26/06/2008 em 08:43 - Reply

    Você 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.

  14. John-Henrique quinta-feira, 26/06/2008 em 10:05 - Reply

    @ 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!

  15. Leonardo quarta-feira, 02/07/2008 em 08:28 - Reply

    Só 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!

  16. John-Henrique quarta-feira, 02/07/2008 em 09:05 - Reply

    @ LEONARDO
    Qual a versão do seu MySQL?
    Você está testando no servidor local ou remoto (conta de hospedagem)?

    Falopa!

  17. Eduardo terça-feira, 29/07/2008 em 14:43 - Reply

    Essa 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!

  18. Thiago Santos segunda-feira, 04/08/2008 em 18:21 - Reply

    A 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

  19. fabiano quarta-feira, 25/02/2009 em 15:16 - Reply

    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.

  20. Juscelino Barão terça-feira, 26/05/2009 em 21:59 - Reply

    Para usar o REPLACE INTO é necessário ter uma chave primária?

    • John-Henrique sexta-feira, 05/06/2009 em 20:11 - Reply

      @ 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!

  21. Benvindo domingo, 05/07/2009 em 12:06 - Reply

    Cara é o que eu estava precisando. PARABÉNS PELA DICA!

  22. Benvindo domingo, 05/07/2009 em 12:11 - Reply

    É 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?

    • John-Henrique domingo, 05/07/2009 em 13:51 - Reply

      @ BENVINDO
      É possível sim, apenas deixe de informar os campos que não deseja alterar.

      Falopa!

  23. Carlos André Ferrari quinta-feira, 17/09/2009 em 07:39 - Reply

    Uso assim:

    if (is_numeric($id)) $sql = update; else $sql = insert;

    []‘s

  24. Julio Fagundes sexta-feira, 18/06/2010 em 16:59 - Reply

    Exatamente, 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

  25. Luci sexta-feira, 26/11/2010 em 14:13 - Reply

    Eu gostaria de fazer como você falou, só que para grandes quantidades de dados. Por exemplo os Rg estão no formato 00.000.000-0 e quero deixa-lo sem pontos e hífens, para todos os meus 3000 rg’s. Como faço isto?!

Opine também » Coloque sua foto no comentário