Supprimer les doublons

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour :)
J'ai une base de donnée assez conséquente, d'environ 250 000 entrées, qui contient des doublons. Il y a une colonne qui contient du texte qui s'appel "domaine". Le but est de supprimer les doublons dans la colonne domaine. Vu le nombre de lignes dans la base de donnée, je ne peux pas y réaliser avec une boucle, je doit donc le faire en une seule requête. J'ai trouvé des tutos/exemples sur Internet sans réussir. Que pourrais-je utiliser ?

Merci d'avance :) !

(ಠ_ಠ) visite Drozor

+0 -0

Il te suffit de procéder ainsi :

C'est irréversible.

Édité par Vayel

+0 -0
Auteur du sujet

Comment je fait la suppression des lignes n'y appartenant pas ?
Je pense que c'est NOT IN, mais je n'y arrive pas (j'ai ça :
sql : DELETE FROM sites WHERE ID NOT IN (SELECT DISTINCT ID, domaine FROM sites) )

Édité par Aze

(ಠ_ಠ) visite Drozor

+0 -0
Auteur du sujet

j'ai aussi essayé ça :

1
DELETE sites WHERE ID NOT IN (SELECT MIN(ID) FROM sites GROUP BY domaine)

mais ça me redonne aussi une erreur de syntaxe

Édité par Aze

(ಠ_ಠ) visite Drozor

+0 -0

Du coup, tu peux créé un index unique sur la table avec la commande ALTER IGNORE TABLE sites ADD UNIQUE INDEX(domaine); cela supprimera toutes les lignes qui ont le même domaine.

Quand on essaye d’inséré une nouveau doublon, ça affichera une erreur, si ce comportement te pose des soucis, tu peux supprimer la contrainte en faisant un ALTER TABLE sites DROP INDEX domaine;.

Tu peux trouver plus d'explication sur ce site.

+0 -0
Auteur du sujet

Cela me retourne cette erreur :p : Syntax error or access violation: 1170 La colonne 'domaine' de type BLOB est utilisée dans une définition d'index sans longueur d'index' on line 16

(ಠ_ಠ) visite Drozor

+0 -0

Essaye :

1
DELETE FROM sites WHERE ID NOT IN (SELECT ID, DISTINCT domaine FROM sites)

Le problème de cette sous-requête, c'est qu'elle va retourner une liste de couples (id, domaine), donc on compare dans le WHERE un identifiant (un entier) à un couple.

+0 -0

C'est pas le type de champ adapté pour sauvegarder du texte, "blob", c'est pour stocker du binaire. Tu peux le changer en type "text" ou c'est une obligation métier de le garder sous format "blob" ?

Si tu peux le changer, tente un ALTER TABLE sites MODIFY domaine varchar(500). Fait attention, je connais pas les risques, si le texte contient des accents, le mieux serait de faire une sauvegarde avant d'envoyer la commande. Si la dernière commande passe, tu peux tenter l'index pour supprimer les doublons.

Édité par anonyme

+0 -0

Cette réponse a aidé l'auteur du sujet

Du coup, j'ai éditer entre temps, la bonne commande est ALTER TABLE sites MODIFY domaine varchar(500) te permetant de changer le type de colonne de ton champ dans MYSQL. Ça supprime rien, ça change juste le type de colonne.

Après tu peux exécuter, la commande ALTER IGNORE TABLE sites ADD UNIQUE INDEX(domaine).

+1 -0

De ce que j'ai vu, il faut créer une autre table :

  • Tu crées une table T avec les éléments que tu souhaites conserver ;
  • Tu supprimes les éléments de la table sites dont l'id n'apparaît pas dans la table T ;
  • Tu supprimes T.
+0 -0
Auteur du sujet

La solution du dernier message de Hugo est bonne :)
Merci !!!!! (et merci aussi a toi Vayel pour avoir cherché aussi :) !)
(sur les 592 000 lignes il n'en reste plus que 335 000 :) !)

Édité par Aze

(ಠ_ಠ) visite Drozor

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte