sql >> Database >  >> RDS >> Mysql

Alle dubbele rijen verwijderen, behalve één in MySQL?

Waarschuwing van de redactie:deze oplossing is rekenkundig inefficiënt en kan uw verbinding voor een grote tafel weghalen.

NB - Je hebt nodig om dit eerst te doen op een testkopie van je tafel!

Toen ik het deed, ontdekte ik dat, tenzij ik ook AND n1.id <> n2.id had opgenomen , het heeft elke rij in de tabel verwijderd.

  1. Als u de rij met de laagste id . wilt behouden waarde:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Als u de rij met de hoogste id . wilt behouden waarde:

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

Ik heb deze methode gebruikt in MySQL 5.1

Niet zeker over andere versies.

Update:aangezien mensen die Googlen voor het verwijderen van duplicaten hier terechtkomen
Hoewel de vraag van de OP gaat over DELETE , houd er rekening mee dat het gebruik van INSERT en DISTINCT gaat veel sneller. Voor een database met 8 miljoen rijen duurde de onderstaande zoekopdracht 13 minuten, bij gebruik van DELETE , het duurde meer dan 2 uur en is toch niet voltooid.

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



  1. Verschillende manieren om SQL Server AlwaysOn-beschikbaarheidsgroepen te bewaken

  2. Hoe de Ln()-functie werkt in PostgreSQL

  3. Matrix voor door SQL Server ondersteunde versies

  4. Hoe Postgres JSONB-gegevenstype gebruiken met JPA?