Anúncio provido pelo BuscaPé
2
Mai 2007

MySQL REPLACE melhore seu INSERT e UPDATE

Publicado em Desenvolvimento, MySQL, Tecnologia por John-Henrique às 9:21 pm |

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

Talvez você queira ver

Mega Kit Portal Php # Portais # Templates # Modelos De Sites
Mega Kit Portal Php # Portais # Templates # Modelos De Sites
Mais info»
R$ 15.00
17.500 Modelos De Sites Prontos Editáveis   4 Lojas Virtuais
17.500 Modelos De Sites Prontos Editáveis 4 Lojas Virtuais
Mais info»
R$ 29.90
7 Mega Portais Em Php E Mysql     Confira:  O Melhor Do Ml
7 Mega Portais Em Php E Mysql Confira: O Melhor Do Ml
Mais info»
R$ 20.00

O autor se reserva ao direito de não permitir a reprodução deste conteúdo.


18 comentários:

djulian comentou:

muito bom ;) parabens


vinicius comentou:

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!


John-Henrique comentou:

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!


daniel comentou:

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


Thiago Rodrigues comentou:

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


Joao comentou:

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


John-Henrique comentou:

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


Joao comentou:

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


Joao comentou:

— 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


Rafagd comentou:

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.


Thiago comentou:

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


Rafagd comentou:

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


Diego comentou:

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.


John-Henrique comentou:

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


Leonardo comentou:

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!


John-Henrique comentou:

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

Falopa!


Eduardo comentou:

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!


Thiago Santos comentou:

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


Deixe sua opinião







Você pode usar tags HTML como: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>