Slette duplikater fra MySQL

Jeg har etterhvert skaffet meg en pen liten samling sitater i en MySQL tabell som brukes til WordPress-innstikket XmasB Quotes. I skrivende stund er det cirka 14000 ((Fjorten tusen, ja)) sitater totalt. Du ser et tilfeldig av disse til høyre på min hjemmeside.

14000 sitater er selvfølgelig ikke et resultat av manuelle måter å legge de inn på. Jeg har laget et lite program som gjør om en liste til MySQL setninger for å legge det inn. Dermed legger jeg inn flere tusen på noen sekunder, gitt at jeg har en liste over sitatene å hente fra. Som et resultat av denne måten å gjøre det på har jeg fått mange duplikater i samlingen ((Jeg kunne selvfølgelig sjekket for duplikater når jeg legger sitatene inn, men det gjør jeg altså ikke.)). Cirka 500 var det før jeg fjernet de tidligere idag. Så hvordan fjerner man duplikater fra en MySQL tabell?

Det finnes sikkert mange måter å gjøre en slik jobb på. Jeg valgte å gjøre det enkelt, med enkle spørringer og en midlertidig tabell.

  1. Først lager jeg en midlertidig tabell hvor duplikatene er luket ut: CREATE TABLE quotes_temp AS SELECT * FROM wp_xmasb_quotes GROUP BY quote, author Den nye tabellen vil nå kun inneholde sitatene hvor «quote» og «author» til sammen er unikt, det sørger klausulen «GROUP BY» for.
  2. Neste skritt – tømme den originale tabellen: TRUNCATE wp_xmasb_quotes TRUNCATE fjerner innholdet på samme måte som en DELETE kommando ((Men TRUNCATE er ikke det samme som en DELETE – den vil blant annet ikke returnere antall rader slettet. Den vil heller ikke trigge ON DELETE)). Backup er selvfølgelig tatt på forhånd? Kjedelig å miste data…
  3. Kopier innholdet fra temp tabellen inn i den originale: INSERT INTO wp_xmasb_quotes SELECT * FROM quotes_temp
  4. Slett den temporære tabellen: DROP TABLE quotes_temp

Verre er det ikke.

9 tanker om “Slette duplikater fra MySQL

  1. XmasB Innleggsforfatter

    Det er jo derfor man tar backup, André. I verste fall er det jo da bare å kjøre «undo». Jeg tar alltid backup når jeg jobber direkte på dataene i WordPress. Først og fremst fordi det er så enkelt, og en grei sikkerhet å ha.

    Svar
  2. Grim

    Men du tar jo ikke høyde for forskjellig tegnsetting eller store/små bokstaver 🙂 Fjern alle mellomrom og tegn, gjør alt til store bokstaver og fjerner du duplikater. Nå har vi selvsagt ikke tatt hensyn til britisk og amerikansk staving, men det får bli en hjemmelekse til neste gang.

    Svar
  3. Fredelig

    Ser ut som «don’t» nå vises som «don't» etter oppryddingen din… 😉

    eks. If there is not the war, you don't get the great general; if there is not a great occasion, you don't get a great statesman; if Lincoln had lived in a time of peace, no one would have known his name. Theodore Roosevelt

    Svar
  4. XmasB Innleggsforfatter

    Sant nok, Grim. Men jeg tar høyde for det når jeg fyller tabellen i programmet mitt (og også i innstikket), så det er ikke så nøye i mitt tilfelle. Jeg får rette på dette etterhvert så vi får det ordentlig.

    Det er ikke på grunn av oppryddingen, men en liten bug i .net programmet jeg skrev, Fredelig. Den konverterer tegn for å xml sikkert, men ikke helt slik jeg vil. En kjapp replace i MySQL fikser det. Skal se på det senere.

    Jeg har fått relativt gode backuprutiner etterhvert, André. Er ikke så nøye på programmer og slikt (det meste jobbrelatert er ikke på egen pc), men tar jevnlig backup av bilder, mp3 og video ved hjelp av SyncToy. Genialt lite program. Spesielt til å komme fra Microsoft.

    Svar
  5. XmasB Innleggsforfatter

    Da skulle alt være i orden. Har tatt en opprydding på tegnsett ved hjelp av noen spørringer av denne typen: update wp_xmasb_quotes set quote = replace(quote, "'","’") Store/små bokstaver og slikt får jeg heller ta siden, Grim. Med over 14000 sitater er det neppe noen som reagerer på at to er like (noe jeg ikke tror det er. Innstikket sjekker nemlig etter duplikater også). Du kan jo trykke på refresh knappen til du finner det? 🙂

    Svar
  6. XmasB Innleggsforfatter

    Hehe, jeg vet du klarer det, Grim. 🙂

    Hey, BeautifulSoup så litt morsomt ut!

    You didn’t write that awful page. You’re just trying to get some data out of it. Right now, you don’t really care what HTML is supposed to look like. Neither does this parser.
    Svar

Legg inn en kommentar