sql >> Database teknologi >  >> RDS >> Mysql

Slet alle duplikerede rækker undtagen én i MySQL?

Redigeringsadvarsel:Denne løsning er beregningsmæssigt ineffektiv og kan ødelægge din forbindelse til et stort bord.

NB - Du bruger at gøre dette først på en testkopi af dit bord!

Da jeg gjorde det, fandt jeg ud af, at medmindre jeg også inkluderede AND n1.id <> n2.id , den slettede hver række i tabellen.

  1. Hvis du vil beholde rækken med det laveste id værdi:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Hvis du vil beholde rækken med det højeste id værdi:

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

Jeg brugte denne metode i MySQL 5.1

Ikke sikker på andre versioner.

Opdatering:Da folk, der googler for at fjerne dubletter, ender her
Selvom OP's spørgsmål handler om DELETE , vær opmærksom på, at du bruger INSERT og DISTINCT er meget hurtigere. For en database med 8 millioner rækker tog nedenstående forespørgsel 13 minutter, mens du brugte DELETE , det tog mere end 2 timer og blev alligevel ikke fuldført.

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



  1. Oprettelse af en Docker Swarm Cluster på Azure Container Service

  2. Fejlfinding, der løber tør for arbejdstråde

  3. Charlotte SQL Server-brugergruppe:Rette langsomme forespørgsler. Hurtig.

  4. Fejl under afsendelse af QUERY-pakke