Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Excluir linhas duplicadas no MySQL (ignora chave primária)


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.