Sådan sletter MySQL dubletter

How Mysql Delete Duplicate Rows



MySQL er et relationelt datasæt, der gemmer data i tabeller, der har rækker og kolonner. De data, der er gemt i databasen, kan dog indeholde dublerede værdier forårsaget af fejl i applikationer eller brugere.

I denne vejledning lærer vi, hvordan du fjerner dublerede rækker i en MySQL -database for at reducere databasestørrelse og hjælpe med at øge serverens ydeevne.







Inden vi fortsætter, antager vi:



  1. Du har MySQL installeret og kører på dit system
  2. Du har root -adgang til databasen.
  3. Du har adgang til en database til eksperimentering eller test

BEMÆRK : Hvis du har brug for en eksempeldatabase for at prøve begreberne i denne vejledning, skal du overveje Sakila -databasen eller downloade en kopi af databasen, der bruges i denne vejledning.



Ressourcer er angivet nedenfor:





Grundlæggende brug

Inden vi begynder, vil vi med vilje oprette en tabel, der indeholder dublerede værdier til testformål. SQL -forespørgslerne til at udføre denne handling er nedenfor:

BRUG verden;
DRÅBE BORD HVIS EKSISTERES brugere;
SKAB BORD brugere(id INT PRIMÆRNØGLE IKKE NUL AUTO_INCREMENT ,brugernavn VARCHAR (10) IKKE NUL ,fulde navn VARCHAR (tyve),e -mail VARCHAR (255) IKKE NUL );
INDSÆT IND I brugere(brugernavn,fulde navn,e -mail) VÆRDIER
('Jomfru', 'Claude M. Mori', '[email protected]'),
('trykke', 'Tiffany G. Bailey', '[email protected]'),
('raket', 'Christopher S. Payton', '[email protected]'),
('mørkt stof', 'Patricia J. Fox', '[email protected]'),
('emne', 'Faye H. Hartley', '[email protected]'),
('mørkt stof', 'Patricia J. Fox', '[email protected]'),
('raket', 'Christopher S. Payton', '[email protected]'),
('artemis', 'Wesley C. Dillard', '[email protected]');

Du er velkommen til at ændre forespørgslen ovenfor, så den passer til dine behov. Du bør også sikre, at du har oprettet databasen (verden) for at undgå fejl.



Hvis vi nu får alle data inde i tabellen og i rækkefølge efter brugernavn, ser vi de dubletter, vi har, som vist:

mysql> brug verden;
Database ændret
mysql> VÆLG * FRA brugere BESTIL AF brugernavn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|brugernavn|fulde navn|e -mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -mail beskyttet]|
| 4 |mørkt stof|Patricia J. Fox|[e -mail beskyttet]|
| 6 |mørkt stof|Patricia J. Fox|[e -mail beskyttet]|
| 2 |trykke|Tiffany G. Bailey|[e -mail beskyttet]|
| 5 |emne|Faye H. Hartley|[e -mail beskyttet]|
| 3 |raket|Christopher S. Payton|[e -mail beskyttet]|
| 7 |raket|Christopher S. Payton|[e -mail beskyttet]|
| 1 |Jomfru|Claude M. Mori|[e -mail beskyttet]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Som du kan se fra tabellen ovenfor, har vi to dublerede værdier, der gør databasen større uden grund og forårsager langsomme hastigheder.

Lad os nu lære, hvordan vi kan fjerne disse værdier.

#1 - SLET JOIN

En måde at fjerne dublerede rækker i en database er at bruge MySQL DELETE JOIN -sætningen. Forespørgslen bruger imidlertid id'er til at fjerne dublerede værdier.

For at fjerne de dublerede værdier i tabellen ovenfor kan vi f.eks. Indtaste:

SLET tabel 1 FRA brugernes tabel 1 INDRE TILSLUTTE brugernes tabel 2 HVOR tabel1.id<tabel2.id OG tabel1.email=tabel2.email;

Når du har udført forespørgslen ovenfor, fjerner du de dublerede værdier som vist i output nedenfor:

mysql> SLET tabel 1 FRA brugernes tabel 1 INDRE TILSLUTTE brugernes tabel 2 HVOR tabel1.id<tabel2.id OG tabel1.email=tabel2.email;
Forespørgsel OK, 2berørte rækker(0,01sek)

mysql> VÆLG * FRA brugere BESTIL AF brugernavn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|brugernavn|fulde navn|e -mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -mail beskyttet]|
| 6 |mørkt stof|Patricia J. Fox|[e -mail beskyttet]|
| 2 |trykke|Tiffany G. Bailey|[e -mail beskyttet]|
| 5 |emne|Faye H. Hartley|[e -mail beskyttet]|
| 7 |raket|Christopher S. Payton|[e -mail beskyttet]|
| 1 |Jomfru|Claude M. Mori|[e -mail beskyttet]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Row_Number () -funktion

Den anden metode, vi kan implementere, er at bruge MySQL row_number () -funktionen. Denne funktion understøttes i MySQL version 8 og nyere.

Det fungerer ved at tildele en sekventiel int -værdi til hver række, hvor rækker, der indeholder dublerede værdier, får en værdi højere end 1.

Hvis du vil lære mere om denne funktion, skal du bruge den ressource, der er angivet nedenfor:

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

Overvej forespørgslen herunder, der returnerer id'et for rækkerne med dublerede værdier:

VÆLG id FRA ( VÆLG id,ROW_NUMBER()OVER( SKILLEVÆG AF brugernavn BESTIL AF brugernavn) SOM row_var FRA brugere)t1 HVOR row_var> 1;

Når du har udført ovenstående forespørgsel, skal du få listen over id'er som vist i output nedenfor:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2rækker i sæt (0,01sek)

Hvis du vil fjerne værdierne, skal du blot erstatte SELECT -sætningen med DELETE -sætningen som vist herunder:

SLET FRA brugere HVOR id I ( VÆLG id FRA ( VÆLG id,ROW_NUMBER()OVER( SKILLEVÆG AF brugernavn BESTIL AF brugernavn) SOM row_var FRA brugere)t1 HVOR row_var> 1);

Endelig kan du kontrollere, at de dublerede værdier fjernes ved hjælp af SELECT -sætningen.

mysql> VÆLG * fra brugere BESTIL AF brugernavn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|brugernavn|fulde navn|e -mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -mail beskyttet]|
| 4 |mørkt stof|Patricia J. Fox|[e -mail beskyttet]|
| 2 |trykke|Tiffany G. Bailey|[e -mail beskyttet]|
| 5 |emne|Faye H. Hartley|[e -mail beskyttet]|
| 3 |raket|Christopher S. Payton|[e -mail beskyttet]|
| 1 |Jomfru|Claude M. Mori|[e -mail beskyttet]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Konklusion

I denne vejledning diskuterede vi de to metoder til fjernelse af dublerede værdier fra en database. Store databaser, især dem i almindelig brug, kan indeholde mange dublerede værdier fra ekstern import og andre fejl. Derfor er der behov for at blive ved med at rense dublerede værdier for at sikre, at applikationer fungerer optimalt.