MySQL REPLACE melhore seu INSERT e UPDATE

25

Por John-Henrique | Publicado em Desenvolvimento, MySQL, Tecnologia em 21:21 | Visto visto 6.040 vezes.

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, games, PS2, PS3, Playstation, Wii, iPod no JáCotei.

Related Posts with Thumbnails
Veja isto também
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
150 Loja Virtual   Modelos Novos 2010   Oscommerce Magento
150 Loja Virtual Modelos Novos 2010 Oscommerce Magento
Mais info»
R$ 29.90
até 18x de 2.24
Sistema De Site Para Revenda De Auto Em Php Script Mysql
Sistema De Site Para Revenda De Auto Em Php Script Mysql
Mais info»
R$ 10.00
até 18x de 0.75
Script Imobiliária Virtual Em Php   Mysql   Venda De Imovéis
Script Imobiliária Virtual Em Php Mysql Venda De Imovéis
Mais info»
R$ 10.00
até 18x de 0.75
150 Loja Virtual   Modelos Novos 2010   Oscommerce Magento
150 Loja Virtual Modelos Novos 2010 Oscommerce Magento
Mais info»
R$ 29.90
até 18x de 2.24
Sistema De Site Para Revenda De Auto Em Php Script Mysql
Sistema De Site Para Revenda De Auto Em Php Script Mysql
Mais info»
R$ 10.00
até 18x de 0.75
Vitrine Tecnoblog  

Comments (25)

muito bom ;) parabens

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!

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!

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

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

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

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

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

— 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

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.

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

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

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.

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

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!

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

Falopa!

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!

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

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.

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

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

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

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

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

Falopa!

Uso assim:

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

[]’s

Escreva seu comentário

Aprenda a colocar sua foto nos comentários

Aprenda a colocar sua foto nos comentários