Voici des exemples de suppression de lignes en double d'une table dans MariaDB lorsque ces lignes ont une clé primaire ou une colonne d'identifiant unique.
Les exemples suppriment les lignes en double mais en conservent une. Ainsi dans le cas de deux lignes identiques, il en supprime une et conserve l'autre.
Exemple de données
Nos exemples utilisent les données suivantes :
SELECT * FROM Dogs;
Résultat :
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
Nous pouvons voir que les deux premières lignes sont des doublons, ainsi que les trois dernières lignes.
Le DogId
colonne contient des valeurs uniques (parce que c'est la clé primaire de la table), et donc, à proprement parler, il n'y a pas de doublons. Mais dans des situations réelles, vous souhaiterez souvent dédupliquer des tables contenant des clés primaires. Par conséquent, dans cet article, nous ignorons la clé primaire et nous détectons les valeurs en double dans les colonnes restantes.
Option 1
Commençons notre première option en sélectionnant toutes les lignes qui seront supprimées :
SELECT * FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Résultat :
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
Pour supprimer ces lignes en double, nous pouvons basculer le SELECT *
pour DELETE
:
DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Résultat :
Query OK, 3 rows affected (0.017 sec)
Et pour vérifier le résultat, nous pouvons sélectionner toutes les lignes restantes dans le tableau :
SELECT * FROM Dogs;
Résultat :
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Nous pouvons également utiliser le MAX()
fonction au lieu de MIN()
fonction pour changer les lignes à supprimer.
Option 2
Dans cet exemple, nous supposerons que la table a été restaurée dans son état d'origine (avec les doublons).
Nous pouvons utiliser la requête suivante pour vérifier les lignes en double :
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
);
Résultat :
+-------+-----------+----------+-------+-----------+----------+ | DogId | FirstName | LastName | DogId | FirstName | LastName | +-------+-----------+----------+-------+-----------+----------+ | 2 | Bark | Smith | 1 | Bark | Smith | | 7 | Wag | Johnson | 5 | Wag | Johnson | | 7 | Wag | Johnson | 6 | Wag | Johnson | +-------+-----------+----------+-------+-----------+----------+
Et nous pouvons modifier cette requête pour supprimer les doublons :
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
)
);
Résultat :
Query OK, 3 rows affected (0.075 sec)
La table a maintenant été dédupliquée.
Nous pouvons le vérifier en sélectionnant à nouveau toutes les lignes :
SELECT * FROM Dogs;
Résultat :
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Nous pouvons utiliser MAX()
au lieu de MIN()
pour supprimer les autres lignes des doublons si vous préférez.