Diseño Web. Desarrollo y Programación en Php.

Eliminar registros duplicados en MySql

A veces nos encontramos con tablas que contienen registros duplicados que debemos eliminar. Aquí les dejo una manera muy simple y efectiva de hacerlo.

Posteado el 30 de Abril de 2008

¿Alguna ves se encontraron con una tabla sin indicies, con registros duplicados, etc. y les toca a ustedes tener que arreglarla? Acá les voy a dejar una solución muy simple para solucionar estos problemas.

El problema:

Supongamos que nos encontramos con una tabla desastrosa, como esta:

id	ciudad
1 Arroyo Seco
2 Acebal
2 Acebal

3 Alcorta
4 Arequito
4 Arequito

5 Armstrong

Como pueden ver, hay registros identicos, donde además de coincidir el nombre de la ciudad, también coincide el id.

Si intentan borrar uno manualmente, les va a pasar que se van a borrar los 2 al mismo tiempo y por consiguiente van a perder la información. Incluso poniendo LIMIT 1 en el DELETE, igual se borran los 2 registros al mismo tiempo.

Por suerte, aunque parezca un problema complicado, la solución es bastante simple.

La Solución:

Primero vamos a crear otra tabla, temporalmente, similar a la original pero sin los duplicados.

CREATE TABLE ciudades_temporal AS SELECT * FROM ciudades GROUP BY (id);

Despues simplemente borramos la tabla con los duplicados y renombramos la tabla temporal con el mismo nombre que la original.

DROP TABLE ciudades;
RENAME TABLE ciudades_temporal TO ciudades;

Por ultimo, tendremos que crear los indices correspondientes y revisar la lógica del sistema que generó esa tabla, para que asegurarnos que no vuelva a pasar.

Espero que les sea útil.
Saludos. Pablo

Comentarios:

Alberto Ferrer 5 de Mayo de 2008 a las 11:25 hs

Creo que con DISTINCT haces lo mismo.
Aca te dejo una referencia:
http://sql.1keydata.com/es/sql-distinct.php

Pablo Impallari 17 de Mayo de 2008 a las 03:35 hs

Puede ser, pero siempre trato de evitarlo porque DISTINCT suele tener algunos bugs, como por ejemplo:
http://bugs.mysql.com/bug.php?id=21456

Loksly 22 de Diciembre de 2008 a las 10:01 hs

A mí me parece mejor solución esta:
ALTER IGNORE TABLE ciudades ADD UNIQUE INDEX(nombre);

y luego en función de si te interesa o no eliminas el índice creado

Pablo Impallari 27 de Diciembre de 2008 a las 20:32 hs

@Loksly: Esa es buena también. Gracias por el aporte.

SERGIO 13 de Mayo de 2009 a las 10:50 hs

mi problema es parecido en la pagian de comentarios aparecen comentarios incoerentes y sin sentido. como elimino eso.
La URL es esta: http://www.casosltda.com/index.php?option=com_content&task=view&id=28&Itemid=48

Panlo Impallari 16 de Mayo de 2009 a las 06:06 hs

@SERGIO:
Por lo que veo, tu sitio esta hecho con Joomla. La verdad es que nunca lo usé demasiado asique no te puedo ayudar demasiado, pero seguramente por algún lado tiene un sistema para administrar los comentarios.
Te recomendaría que consultes en algún foro de Joomla, por ejemplo este:
http://www.joomlaspanish.org/foros/

Seguramente te van a poder dar una mano.
Suerte.

Kalvin Manson 22 de Abril de 2010 a las 14:09 hs

que solucion tan tonta, esto ni siquiera es una solucion, la pregunta es ¿Como eliminar los registros duplicados?, no como copiar y borrar una base de datos.

Diego V. 29 de Abril de 2010 a las 17:43 hs

Si pero tenes una alternativa mucho mas facil

ALTER IGNORE TABLE tabla ADD UNIQUE INDEX(campo);
esto te borra todos los registros duplicados

y si no queres que sea obligatoria cambias ejecutas esto
ALTER TABLE tabla DROP INDEX `campo`;

:)

Envia tu comentario:





Servicios:

Nuestros Clientes:

Consultanos ahora!

Valid XHTML 1.0 Strict
XHTML 1.0 Strict

PabloImpallari

Diseño Web. Desarrollo y Programación en Php.

Tel: (+54) (0341) 4567218.

Cordoba 6345. Rosario, Argentina.