Hur MySQL tar bort dubblerade rader

How Mysql Delete Duplicate Rows



MySQL är en relationsdatauppsättning som lagrar data i tabeller som har rader och kolumner. Data som lagras i databasen kan dock innehålla dubblettvärden orsakade av fel i applikationerna eller användarna.

I den här självstudien lär vi oss hur man tar bort dubblerade rader i en MySQL -databas för att minska databasstorleken och hjälpa till att öka serverns prestanda.







Innan vi fortsätter antar vi:



  1. Du har MySQL installerat och körs på ditt system
  2. Du har root -åtkomst till databasen.
  3. Du har tillgång till en databas för experiment eller testning

NOTERA : Om du behöver en exempeldatabas för att testa begreppen i den här guiden, överväg Sakila -databasen eller ladda ner en kopia av databasen som används i den här guiden.



Resurser finns nedan:





Grundläggande användning

Innan vi börjar skapar vi avsiktligt en tabell som innehåller dubblettvärden för teständamål. SQL -frågorna för att utföra den här åtgärden är nedan:

ANVÄNDA SIG AV värld;
SLÄPPA TABELL OM EXISTERAR användare;
SKAPA TABELL användare(id INT PRIMÄRNYCKEL INTE NULL AUTO_INCREMENT ,Användarnamn VARCHAR (10) INTE NULL ,fullständiga namn VARCHAR (tjugo),e-post VARCHAR (255) INTE NULL );
FÖRA IN IN I användare(Användarnamn,fullständiga namn,e-post) VÄRDEN
('Jungfrun', 'Claude M. Mori', '[e -postskyddad]'),
('Tryck', 'Tiffany G. Bailey', '[e -postskyddad]'),
('raket', 'Christopher S. Payton', '[e -postskyddad]'),
('mörk materia', 'Patricia J. Fox', '[e -postskyddad]'),
('ämne', 'Faye H. Hartley', '[e -postskyddad]'),
('mörk materia', 'Patricia J. Fox', '[e -postskyddad]'),
('raket', 'Christopher S. Payton', '[e -postskyddad]'),
('artemis', 'Wesley C. Dillard', '[e -postskyddad]');

Ändra frågan ovan för att passa dina behov. Du bör också se till att du har databasen (världen) skapad för att undvika fel.



Om vi ​​nu får all data i tabellen och i ordning efter användarnamn kommer vi att se de dubbletter vi har som visas:

mysql> använda sig av värld;
Databas ändrats
mysql> VÄLJ * FRÅN användare SORTERA EFTER Användarnamn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|Användarnamn|fullständiga namn|e-post|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -postskyddad]|
| 4 |mörk materia|Patricia J. Fox|[e -postskyddad]|
| 6 |mörk materia|Patricia J. Fox|[e -postskyddad]|
| 2 |Tryck|Tiffany G. Bailey|[e -postskyddad]|
| 5 |ämne|Faye H. Hartley|[e -postskyddad]|
| 3 |raket|Christopher S. Payton|[e -postskyddad]|
| 7 |raket|Christopher S. Payton|[e -postskyddad]|
| 1 |Jungfrun|Claude M. Mori|[e -postskyddad]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Som du kan se från tabellen ovan har vi två dubblettvärden som gör databasen större utan anledning och orsakar långsamma hastigheter.

Låt oss nu lära oss hur vi kan ta bort dessa värden.

#1 - RADERA GÅ MED

Ett sätt att ta bort dubblerade rader i en databas är att använda MySQL DELETE JOIN -satsen. Frågan använder dock id: er för att ta bort dubblettvärden.

Till exempel, för att ta bort dubblettvärdena i användartabellen ovan, kan vi mata in:

RADERA bord 1 FRÅN användare tabell 1 INRE ANSLUTA SIG användare tabell 2 VAR table1.id<table2.id OCH table1.email=table2.email;

När du har utfört frågan ovan tar du bort dubblettvärdena som visas i utdata nedan:

mysql> RADERA bord 1 FRÅN användare tabell 1 INRE ANSLUTA SIG användare tabell 2 VAR table1.id<table2.id OCH table1.email=table2.email;
Fråga OK, 2rader som påverkas(0,01sek)

mysql> VÄLJ * FRÅN användare SORTERA EFTER Användarnamn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|Användarnamn|fullständiga namn|e-post|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -postskyddad]|
| 6 |mörk materia|Patricia J. Fox|[e -postskyddad]|
| 2 |Tryck|Tiffany G. Bailey|[e -postskyddad]|
| 5 |ämne|Faye H. Hartley|[e -postskyddad]|
| 7 |raket|Christopher S. Payton|[e -postskyddad]|
| 1 |Jungfrun|Claude M. Mori|[e -postskyddad]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Row_Number () -funktion

Den andra metoden vi kan implementera är att använda funktionen MySQL row_number (). Denna funktion stöds i MySQL version 8 och högre.

Det fungerar genom att tilldela ett sekventiellt int -värde till varje rad, med rader som innehåller dubblettvärden får ett värde högre än 1.

För att lära dig mer om den här funktionen, använd resursen nedan:

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

Tänk på frågan nedan som returnerar id för raderna med dubblettvärden:

VÄLJ id FRÅN ( VÄLJ id,ROW_NUMBER()ÖVER( DELA MED användarnamn SORTERA EFTER Användarnamn) SOM row_var FRÅN användare)t1 VAR row_var> 1;

När du har utfört ovanstående fråga bör du få listan över id: er som visas i utdata nedan:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2rader i uppsättning (0,01sek)

Om du vill ta bort värdena ersätter du bara SELECT -satsen med DELETE -satsen enligt nedan:

RADERA FRÅN användare VAR id I ( VÄLJ id FRÅN ( VÄLJ id,ROW_NUMBER()ÖVER( DELA MED användarnamn SORTERA EFTER Användarnamn) SOM row_var FRÅN användare)t1 VAR row_var> 1);

Slutligen kan du verifiera att dubblettvärdena tas bort med hjälp av SELECT -satsen.

mysql> VÄLJ * från användare SORTERA EFTER Användarnamn;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|Användarnamn|fullständiga namn|e-post|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -postskyddad]|
| 4 |mörk materia|Patricia J. Fox|[e -postskyddad]|
| 2 |Tryck|Tiffany G. Bailey|[e -postskyddad]|
| 5 |ämne|Faye H. Hartley|[e -postskyddad]|
| 3 |raket|Christopher S. Payton|[e -postskyddad]|
| 1 |Jungfrun|Claude M. Mori|[e -postskyddad]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Slutsats

I den här självstudien diskuterade vi de två metoderna för att ta bort dubblettvärden från en databas. Stora databaser, särskilt de som är vanliga, kan innehålla många dubblettvärden från extern import och andra fel. Därför är det nödvändigt att fortsätta rensa dubblettvärden för att säkerställa att applikationer fungerar optimalt.