// você está lendo...

Desenvolvimento

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 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, DVD, MP3, LCD, Plasma, HDTV, Home Theater no JáCotei.

Ofertas válidas até a meia noite de hoje
26.000 Modelos Web Sites Editáveis Xhtml Php Psd Flash Asp
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
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
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
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
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
Mega Total Scripts Portal Php Templates Modelos Sites
Mais info»
R$ 15.90
até 18x de 1.19
Vitrine Tecnoblog  

Discussion

26 Responses to “MySQL REPLACE melhore seu INSERT e UPDATE”

  1. muito bom ;) parabens

    Posted by djulian | 18/06/2007, 08:01
  2. 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!

    Posted by vinicius | 29/06/2007, 12:21
  3. 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!

    Posted by John-Henrique | 29/06/2007, 13:32
  4. gostei 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:48
  5. Excelente dica, não conhecia essa função.
    Abraço!

    Posted by Thiago Rodrigues | 05/08/2007, 00:48
  6. 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

    Posted by Joao | 28/08/2007, 08:57
  7. @ 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:57
  8. 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..

    Posted by Joao | 30/08/2007, 11:17
  9. — 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

    Posted by Joao | 30/08/2007, 23:05
  10. 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.

    Posted by Rafagd | 25/10/2007, 13:55
  11. 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

    Posted by Thiago | 27/02/2008, 07:25
  12. 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*/;

    Posted by Rafagd | 27/02/2008, 09:34
  13. 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.

    Posted by Diego | 26/06/2008, 08:43
  14. @ 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:05
  15. 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!

    Posted by Leonardo | 02/07/2008, 08:28
  16. @ 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:05
  17. 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!

    Posted by Eduardo | 29/07/2008, 14:43
  18. 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

    Posted by Thiago Santos | 04/08/2008, 18:21
  19. 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.

    Posted by fabiano | 25/02/2009, 15:16
  20. Para 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:11
  21. Cara é o que eu estava precisando. PARABÉNS PELA DICA!

    Posted by Benvindo | 05/07/2009, 12:06
  22. É 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
  23. Uso assim:

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

    []‘s

    Posted by Carlos André Ferrari | 17/09/2009, 07:39
  24. 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

    Posted by Julio Fagundes | 18/06/2010, 16:59

Post a comment

Recentes

caneca cafe canon 3
Caneca de café em formato de lentes Canon
agosto 31, 2010
By John-Henrique
Rapid Share Premium grátis
Rapid Share Premium grátis
agosto 23, 2010
By John-Henrique
TV LCD 42″
Promoção “Quer ganhar uma TV LCD 42″?”
agosto 22, 2010
By John-Henrique
Resident Evil 4 – Afterlife
Resident Evil 4 – Afterlife
agosto 20, 2010
By John-Henrique
invencoes-extranhas (32)
Invenções estranhas II
agosto 19, 2010
By John-Henrique
invencoes-extranhas (15)
Invenções estranhas
agosto 18, 2010
By John-Henrique
metallica presidio
Diferenças entre Presídio e Trabalho
agosto 16, 2010
By John-Henrique
Mercedes-Benz SCL600 6
Mercedes-Benz SCL600
agosto 15, 2010
By John-Henrique
Como baixar videos da internet
julho 21, 2010
By Carlos Camacho
vlc media player
VLC Media Player – Assista vídeos e filmes com maior facilidade
julho 19, 2010
By Carlos Camacho