El siguiente ejemplo elimina filas duplicadas en MySQL mientras ignora la clave principal o la columna de identificador único.
El ejemplo elimina filas duplicadas pero mantiene una. Entonces, en el caso de dos filas idénticas, elimina una de ellas y mantiene la otra.
Datos de muestra
Supongamos que tenemos una tabla con los siguientes datos:
SELECT * FROM Dogs;
Resultado:
+---------+-------------+------------+ | DogId | FirstName | LastName | |---------+-------------+------------| | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +---------+-------------+------------+
Podemos ver que las dos primeras filas son duplicados y las últimas tres filas son duplicados.
Encuentra los duplicados
Primero, seleccionemos revisar nuestra tabla para ver cuántas filas están duplicadas:
SELECT
FirstName,
LastName,
COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName, LastName
HAVING COUNT(*) > 1;
Resultado:
+-----------+----------+-------+ | FirstName | LastName | Count | +-----------+----------+-------+ | Bark | Smith | 2 | | Wag | Johnson | 3 | +-----------+----------+-------+
Podemos ver que hay dos filas con Bark Smith y tres filas con Wag Johnson.
Desduplicaremos la tabla para que contenga solo uno de cada uno.
Eliminar los duplicados
Ejecutar el siguiente código elimina los duplicados de la tabla anterior:
DELETE d1 FROM Dogs d1
INNER JOIN Dogs d2
WHERE
d1.DogId < d2.DogId AND
d1.FirstName = d2.FirstName AND
d1.LastName = d2.LastName;
Resultado:
Query OK, 3 rows affected (0.00 sec)
Veamos el resultado:
SELECT * FROM Dogs;
Resultado:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 7 | Wag | Johnson | +-------+-----------+----------+
Hemos eliminado con éxito las filas duplicadas de la tabla.