Eliminar registros duplicados en Mysql
Es un problema que nos encontramos muchas veces cuando no tenemos ningún control de contenido duplicado, ¿Como podemos eliminar esos registros de forma sencilla?
Lo primero que tenemos que hacer copiar en una nueva tabla solo los contenidos que no están duplicados, para ello tenemos usar GROUP BY de la siguiente manera:
- CREATE TABLE tabla_temporal AS SELECT * FROM tabla GROUP BY (Columna_contenido_duplicado);
Una vez hecho esto ya tendremos en la tabla tabla_temporal todo el contenido de tabla sin contenido duplicado en la Columna Columna_contenido_duplicado. Lo siguiente que tenemos que hacer es eliminar la tabla que usamos y renombrar la que acabamos de crear con el nombre de esta:
- DROP TABLE tabla;
- RENAME TABLE tabla_temporal TO tabla;
Ahora ya tendrás la base de datos con la Columna Columna_contenido_duplicado sin contenido duplicado, para evitar que vuelva a suceder puedes poner una restricción a esa columna puedes ponerla como PRIMARY KEY o UNIQUE
excelente, me has salvado la vida!, muy buena aportacion.. 1000 gracias
La verdad que de todas las opciones que he mirado, la tuya es la mas sencilla, rapida y completa.
Solucionaste mi problema, muchisimas gracias!
Otra forma sin drop table o eliminar tablas.
Antes de nada efectuar un respaldo de DB y mantenerla en lugar seguro y localizada.
Accedemos a la base de datos, seleccionamos DB y efectuamos respaldo con exportar (pestaña superior) elegimos todas las tablas y procedemos, ya tenemos un respaldo de la DB actualizado que no está nunca de más.
PASOS PARA ELIMINAR CONTENIDO DUPLICADO EN MYSQL
Ahora que ya tenemos el respaldo ya se pueden fiar más de lo que vamos a hacer.
Seguimos en la DB, esta vez punteamos el comando SQL ventana superior y por este orden ejecutamos las siguientes consultas en la ventana editora de texto:
1.
CREATE TABLE `pon el nombre de tu tabla aquí_new` as
SELECT * FROM `pon el nombre de tu tabla aquí` WHERE 1 GROUP BY `title`;
2.
RENAME TABLE tu_tabla TO tu_tabla_bak;
3.
RENAME TABLE tu_tabla_new TO tu_tabla;
No olvides continuar en cada paso (bajo editor derecha)
Explicación comandos: con el paso 1 creamos una nueva tabla desde la tabla que contiene el contenido, para aquellos que no sepan su nombre lo normal es que sea la que más pesa, con _new diferenciamos la original de la nueva o si lo prefieres pon _prohibido_fumar jeje.
Copia y pega tal cual las dos lineas con el nombre de tu tabla. La segunda linea no marca la fuente, osea la tabla original a copiar, lo que le decimos con WHERE… es que ordene la nueva tabla por título eliminándose los registros duplicados, se puede hacer sustituyendo title por cualquier otra función del Order By (id,alias,fulltext….) ver tuto mysql.
Con el paso 2 hacemos un nuevo respaldo a la tabla original, por si acaso no nos gusta el resultado y así basta con volver a renombrar a la inversa para recuperar la tabla original y de paso evitamos conflictos del mismo nombre.
Con el paso tres copias la nueva tabla a tu tabla original y listo, espero que les sirva si tienen gran cantidad de artículos, para poco contenido no merece la pena.
Un saludo de Juan Carlos.
Si pero tienes una alternativa mucho mas fácil
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`;
🙂
Hola…
Funcionó de maravilla… Muchas gracias…
Ahora te pregunto….
Puedo hacer un script con las 3 instrucciones para que se ejecuten una tras otra automaticamente con phpmyadmin, ya se los nombres de las tablas, simpre son las mismas (lo he hecho una a una con phpmyadmin)….
Es para eliminar post duplicados en wordpress de varios blogs..
Gracias
ALTER IGNORE TABLE tabla ADD UNIQUE INDEX(campo);
esta sentencia siempre arroja un error y no soluciona nada mejor es la primera que explicaste
Si pero por ejemplo ustedes explican lo mismo de siempre pero no dicen, po rejemplo, en campo que lleve text no podras poner indixes por que mysql no lo permite y hablo de campos donde son mas usados como para meter redacciones o descripciones largas de un articulo.
lo mejor y mas viable es usar esta sentencia
DELETE FROM mitabla
WHERE campoid NOT IN (SELECT *
FROM (SELECT MIN(n.campoid)
FROM mitabla n
GROUP BY n.micampo) x)