Blog corporativo

Artigos, scripts e dicas postados pelos colaboradores. Não são postados scritps relacionados à trabalhos feitos para clientes.

Localizando registros duplicados no MySQL

Infelizmente nem sempre um banco de dados é criado da forma correta, acarretando além dos diversos problemas, a duplicidade de dados, então é necessários fazer a normalização de um banco de dados, e é muito comum que se começe removendo os registros duplicados.

Para remover registros duplicados existem N métodos, o maior problema é: Como localizar esses registros?

A primeira vista isso realmente parece algo difícil, mas uma query simples resolve tudo, abaixo o script completo:

<?php
$servidor = "localhost";//Geralmente é localhost mesmo
$nome_usuario = "root";//Nome do usuário do mysql
$senha_usuario = ""; //Senha do usuário do mysql
$nome_do_banco = "receitas"; //Nome do banco de dados

$conecta = mysql_connect($servidor,$nome_usuario,$senha_usuario) or die (mysql_error());
mysql_select_db($nome_do_banco,$conecta) or die (mysql_error());

$sql = mysql_query("SELECT *, COUNT(email) reg_dup FROM usuarios GROUP BY email HAVING reg_dup > 1");

while ($dados = mysql_fetch_array($sql)){
extract($dados);
echo $email.' - '.$reg_dup.'<br>';
}
?>


Neste exemplo hipotético a query busca dados de uma tabela chamada usuarios, ele busca os dados duplicados na coluna email, apenas são exibidos os dados que tiverem dois ou mais dados repetidos na referida coluna, no while nós montados os dados exibindo primeiro o e-mail que está duplicado e após a quantidade de vezes que ele aparece duplicado na tabela.

Para remover os duplicados, uma das soluções possíveis é, dentro do while montar outra query removendo os e-mails duplicado, só cuidado, se existem 3 e-mails duplicados, basta remover dois, ou seja, o número de linhas a serem removidas é o que estiver em $reg_dup - 1.

Para testar o exemplo, você pode usar a tabela abaixo:
CREATE TABLE `usuarios` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `nome` varchar(50) default NULL,
  `email` varchar(50) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM ;


Basta copiar e colar no phpmyadmin, popular (inserir dados) e rodar o script após configurar os dados de acesso (usuário, senha, etc...).