sql >> Databasteknik >  >> RDS >> Mysql

Ta bort alla dubbletter av rader utom en i MySQL?

Redaktörsvarning:Den här lösningen är beräkningsineffektiv och kan försämra din anslutning för ett stort bord.

OBS - Du behöver att göra detta först på en testkopia av ditt bord!

När jag gjorde det upptäckte jag att om jag inte också inkluderade AND n1.id <> n2.id , tog den bort varje rad i tabellen.

  1. Om du vill behålla raden med det lägsta id värde:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Om du vill behålla raden med det högsta id värde:

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

Jag använde den här metoden i MySQL 5.1

Inte säker på andra versioner.

Uppdatering:Eftersom personer som googlar för att ta bort dubbletter hamnar här
Även om OP:s fråga handlar om DELETE , tänk på att använda INSERT och DISTINCT är mycket snabbare. För en databas med 8 miljoner rader tog frågan nedan 13 minuter när du använde DELETE , det tog mer än 2 timmar men slutfördes ändå inte.

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



  1. Oracle SQL GROUP BY inte ett GROUP BY uttryck hjälp

  2. SQLite SUM

  3. Hur WEIGHT_STRING() fungerar i MariaDB

  4. Anslut till fjärr MySQL-server med SSL från PHP