Mysql
 sql >> Base de données >  >> RDS >> Mysql

Supprimer toutes les lignes en double sauf une dans MySQL ?

Avertissement de l'éditeur :Cette solution est inefficace en termes de calcul et peut interrompre votre connexion pour une grande table.

NB - Vous avez besoin faire cela d'abord sur une copie de test de votre table !

Quand je l'ai fait, j'ai trouvé cela à moins que j'inclue également AND n1.id <> n2.id , il a supprimé toutes les lignes du tableau.

  1. Si vous souhaitez conserver la ligne avec le plus petit id valeur :

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Si vous souhaitez conserver la ligne avec le id le plus élevé valeur :

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
    

J'ai utilisé cette méthode dans MySQL 5.1

Pas sûr des autres versions.

Mise à jour :étant donné que les personnes qui recherchent sur Google pour supprimer les doublons se retrouvent ici
Bien que la question de l'OP concerne DELETE , veuillez noter que l'utilisation de INSERT et DISTINCT est beaucoup plus rapide. Pour une base de données avec 8 millions de lignes, la requête ci-dessous a pris 13 minutes, tout en utilisant DELETE , cela a pris plus de 2 heures et n'a pas encore été terminé.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;