valores traer seleccionar registros mostrar filas eliminar duplicados duplicadas datos consultar buscar mysql sql duplicates

traer - ¿Borrar todas las filas duplicadas excepto una en MySQL?



select mysql registros duplicados (2)

Posible duplicado:
Eliminar filas duplicadas en MySQL

¿Cómo puedo eliminar todos los datos duplicados de una tabla MySQL?

Por ejemplo, con los siguientes datos:

SELECT * FROM names; +----+--------+ | id | name | +----+--------+ | 1 | google | | 2 | yahoo | | 3 | msn | | 4 | google | | 5 | google | | 6 | yahoo | +----+--------+

Yo usaría SELECT DISTINCT name FROM names; Si fuera una consulta SELECT .

¿Cómo haría esto con DELETE para eliminar solo duplicados y mantener solo un registro de cada uno?


Advertencia del editor: esta solución es computacionalmente ineficiente y puede reducir su conexión para una tabla grande.

NB: primero debe hacer esto en una copia de prueba de su tabla.

Cuando lo hice, descubrí que a menos que también incluyera AND n1.id <> n2.id , se AND n1.id <> n2.id todas las filas de la tabla.

  1. Si desea mantener la fila con el valor de id más bajo:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name

  2. Si desea mantener la fila con el valor de id más alto:

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name

Utilicé este método en MySQL 5.1

No estoy seguro acerca de otras versiones.

Actualización: Ya que las personas que buscan en Google para eliminar duplicados terminan aquí
Aunque la pregunta del OP es sobre DELETE , tenga en cuenta que el uso de INSERT y DISTINCT es mucho más rápido. Para una base de datos con 8 millones de filas, la siguiente consulta tomó 13 minutos, mientras que al usar DELETE , tomó más de 2 horas y aún no se completó.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value) SELECT DISTINCT cellId,attributeId,entityRowId,value FROM tableName;


Si desea mantener la fila con el valor de id más bajo:

DELETE FROM NAMES WHERE id NOT IN (SELECT * FROM (SELECT MIN(n.id) FROM NAMES n GROUP BY n.name) x)

Si quieres el valor de id que es el más alto:

DELETE FROM NAMES WHERE id NOT IN (SELECT * FROM (SELECT MAX(n.id) FROM NAMES n GROUP BY n.name) x)

La subconsulta en una subconsulta es necesaria para MySQL, o obtendrá un error 1093.