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