Hvordan MySQL sletter dupliserte rader

How Mysql Delete Duplicate Rows



MySQL er et relasjonsdatasett som lagrer data i tabeller som har rader og kolonner. Dataene som er lagret i databasen kan imidlertid inneholde dupliserte verdier forårsaket av feil i applikasjonene eller brukerne.

I denne opplæringen skal vi lære hvordan du fjerner dupliserte rader i en MySQL -database for å redusere databasestørrelse og bidra til å øke serverens ytelse.







Før vi fortsetter, antar vi:



  1. Du har MySQL installert og kjører på systemet ditt
  2. Du har root -tilgang til databasen.
  3. Du har tilgang til en database for eksperimentering eller testing

MERK : Hvis du trenger en eksempeldatabase for å prøve konseptene i denne veiledningen, kan du vurdere Sakila -databasen eller laste ned en kopi av databasen som brukes i denne veiledningen.



Ressurser er gitt nedenfor:





Grunnleggende bruk

Før vi begynner, vil vi med vilje lage en tabell som inneholder dupliserte verdier for testformål. SQL -spørringene for å utføre denne handlingen er nedenfor:

BRUK verden;
MISTE BORD HVIS FINNES brukere;
SKAPE BORD brukere(id INT PRIMÆRNØKKEL IKKE NULL AUTO_INCREMENT ,brukernavn VARCHAR (10) IKKE NULL ,fullt navn VARCHAR (tjue),e -post VARCHAR (255) IKKE NULL );
SETT INN INN I brukere(brukernavn,fullt navn,e -post) VERDIER
('Jomfru', 'Claude M. Mori', '[e -postbeskyttet]'),
('trykk', 'Tiffany G. Bailey', '[e -postbeskyttet]'),
('rakett', 'Christopher S. Payton', '[e -postbeskyttet]'),
('mørk materie', 'Patricia J. Fox', '[e -postbeskyttet]'),
('Emne', 'Faye H. Hartley', '[e -postbeskyttet]'),
('mørk materie', 'Patricia J. Fox', '[e -postbeskyttet]'),
('rakett', 'Christopher S. Payton', '[e -postbeskyttet]'),
('artemis', 'Wesley C. Dillard', '[e -postbeskyttet]');

Du er velkommen til å endre spørringen ovenfor for å passe dine behov. Du bør også sørge for at du har databasen (verden) opprettet for å unngå feil.



Hvis vi får alle dataene i tabellen og i rekkefølge etter brukernavn, ser vi duplikatene vi har som vist:

mysql> bruk verden;
Database endret
mysql> PLUKKE UT * FRA brukere REKKEFØLGE ETTER brukernavn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|brukernavn|fullt navn|e -post|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -postbeskyttet]|
| 4 |mørk materie|Patricia J. Fox|[e -postbeskyttet]|
| 6 |mørk materie|Patricia J. Fox|[e -postbeskyttet]|
| 2 |trykk|Tiffany G. Bailey|[e -postbeskyttet]|
| 5 |Emne|Faye H. Hartley|[e -postbeskyttet]|
| 3 |rakett|Christopher S. Payton|[e -postbeskyttet]|
| 7 |rakett|Christopher S. Payton|[e -postbeskyttet]|
| 1 |Jomfru|Claude M. Mori|[e -postbeskyttet]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Som du kan se fra tabellen ovenfor, har vi to dupliserte verdier som gjør databasen større uten grunn og forårsaker lave hastigheter.

La oss nå lære hvordan vi kan fjerne disse verdiene.

#1 - SLETT BLI MED

En måte å fjerne dupliserte rader i en database er å bruke MySQL DELETE JOIN -setningen. Spørringen bruker imidlertid ID -er for å fjerne dupliserte verdier.

For eksempel, for å fjerne dupliserte verdier i brukertabellen ovenfor, kan vi legge inn:

SLETT tabell 1 FRA bruker tabell 1 INDRE BLI MED bruker tabell 2 HVOR tabell1.id<tabell2.id OG tabell1.post=tabell2.post;

Når du har utført spørringen ovenfor, vil du fjerne duplikatverdiene som vist i utdataene nedenfor:

mysql> SLETT tabell 1 FRA bruker tabell 1 INDRE BLI MED bruker tabell 2 HVOR tabell1.id<tabell2.id OG tabell1.post=tabell2.post;
Spørringen OK, 2rader berørt(0,01sek)

mysql> PLUKKE UT * FRA brukere REKKEFØLGE ETTER brukernavn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|brukernavn|fullt navn|e -post|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -postbeskyttet]|
| 6 |mørk materie|Patricia J. Fox|[e -postbeskyttet]|
| 2 |trykk|Tiffany G. Bailey|[e -postbeskyttet]|
| 5 |Emne|Faye H. Hartley|[e -postbeskyttet]|
| 7 |rakett|Christopher S. Payton|[e -postbeskyttet]|
| 1 |Jomfru|Claude M. Mori|[e -postbeskyttet]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Row_Number () -funksjon

Den andre metoden vi kan implementere er å bruke MySQL row_number () -funksjonen. Denne funksjonen støttes i MySQL versjon 8 og nyere.

Det fungerer ved å tildele en sekvensiell int -verdi til hver rad, med rader som inneholder dupliserte verdier som får en verdi høyere enn 1.

For å lære mer om denne funksjonen, bruk ressursen nedenfor:

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

Vurder spørringen nedenfor som returnerer id -en til radene med dupliserte verdier:

PLUKKE UT id FRA ( PLUKKE UT id,ROW_NUMBER()OVER( SKILLEVEGG AV brukernavn REKKEFØLGE ETTER brukernavn) SOM row_var FRA brukere)t1 HVOR row_var> 1;

Når du har utført spørringen ovenfor, bør du få listen over ID -er som vist i utdataene nedenfor:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2rader i sett (0,01sek)

Hvis du vil fjerne verdiene, erstatter du SELECT -setningen med DELETE -setningen som vist nedenfor:

SLETT FRA brukere HVOR id I ( PLUKKE UT id FRA ( PLUKKE UT id,ROW_NUMBER()OVER( SKILLEVEGG AV brukernavn REKKEFØLGE ETTER brukernavn) SOM row_var FRA brukere)t1 HVOR row_var> 1);

Til slutt kan du bekrefte at dupliserte verdier er fjernet ved hjelp av SELECT -setningen.

mysql> PLUKKE UT * fra brukere REKKEFØLGE ETTER brukernavn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|brukernavn|fullt navn|e -post|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -postbeskyttet]|
| 4 |mørk materie|Patricia J. Fox|[e -postbeskyttet]|
| 2 |trykk|Tiffany G. Bailey|[e -postbeskyttet]|
| 5 |Emne|Faye H. Hartley|[e -postbeskyttet]|
| 3 |rakett|Christopher S. Payton|[e -postbeskyttet]|
| 1 |Jomfru|Claude M. Mori|[e -postbeskyttet]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Konklusjon

I denne opplæringen diskuterte vi de to metodene for å fjerne dupliserte verdier fra en database. Store databaser, spesielt de som er i vanlig bruk, kan inneholde mange like verdier fra ekstern import og andre feil. Derfor er det behov for å fortsette å rense dupliserte verdier for å sikre at applikasjoner fungerer optimalt.