O exemplo a seguir exclui linhas duplicadas no MySQL enquanto ignora a chave primária ou a coluna do identificador exclusivo.
O exemplo exclui linhas duplicadas, mas mantém uma. Portanto, no caso de duas linhas idênticas, ele exclui uma delas e mantém a outra.
Dados de amostra
Suponha que temos uma tabela com os seguintes dados:
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 as duas primeiras linhas são duplicadas e as três últimas linhas são duplicadas.
Encontre as duplicatas
Primeiro, vamos selecionar check nossa tabela para ver quantas linhas são 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 há duas linhas com Bark Smith e três linhas com Wag Johnson.
Vamos desduplicar a tabela para que ela contenha apenas um de cada.
Excluir as duplicatas
A execução do código a seguir desduplica a tabela acima:
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)
Vamos ver o resultado:
SELECT * FROM Dogs;
Resultado:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 7 | Wag | Johnson | +-------+-----------+----------+
Removemos com sucesso as linhas duplicadas da tabela.