Aqui estão exemplos de remoção de linhas duplicadas de uma tabela no MariaDB quando essas linhas têm uma chave primária ou uma coluna de identificador exclusivo.
Os exemplos excluem 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
Nossos exemplos usam 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, assim como as três últimas linhas.
O
DogId
A coluna contém valores únicos (porque é a chave primária da tabela) e, portanto, estritamente falando, não há duplicatas. Mas em situações da vida real, muitas vezes você desejará desduplicar tabelas que contêm chaves primárias. Portanto, neste artigo, ignoramos a chave primária e detectamos valores duplicados nas colunas restantes. Opção 1
Vamos iniciar nossa primeira opção selecionando todas as linhas que serão excluídas:
SELECT * FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Resultado:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
Para remover essas linhas duplicadas, podemos alternar o
SELECT *
para DELETE
:DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Resultado:
Query OK, 3 rows affected (0.017 sec)
E para verificar o resultado, podemos selecionar todas as linhas restantes da tabela:
SELECT * FROM Dogs;
Resultado:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Podemos usar alternativamente o
MAX()
função em vez de MIN()
função para alterar quais linhas são excluídas. Opção 2
Neste exemplo, vamos supor que a tabela foi restaurada ao seu estado original (com as duplicatas).
Podemos usar a seguinte consulta para verificar se há linhas duplicadas:
SELECT *
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId = (
SELECT MAX(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
);
Resultado:
+-------+-----------+----------+-------+-----------+----------+ | DogId | FirstName | LastName | DogId | FirstName | LastName | +-------+-----------+----------+-------+-----------+----------+ | 2 | Bark | Smith | 1 | Bark | Smith | | 7 | Wag | Johnson | 5 | Wag | Johnson | | 7 | Wag | Johnson | 6 | Wag | Johnson | +-------+-----------+----------+-------+-----------+----------+
E podemos modificar essa consulta para excluir as duplicatas:
DELETE FROM Dogs WHERE DogId IN (
SELECT d2.DogId
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId=(
SELECT MIN(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
)
);
Resultado:
Query OK, 3 rows affected (0.075 sec)
A tabela agora foi desduplicada.
Podemos verificar isso selecionando todas as linhas novamente:
SELECT * FROM Dogs;
Resultado:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Podemos usar
MAX()
em vez de MIN()
para excluir as outras linhas das duplicatas, se preferir.