Kako MySQL briše duple redove

How Mysql Delete Duplicate Rows



MySQL je relacijski skup podataka koji pohranjuje podatke u tablice koje imaju retke i stupce. Međutim, podaci pohranjeni u bazi podataka mogu sadržavati dvostruke vrijednosti uzrokovane pogreškama u aplikacijama ili korisnicima.

U ovom ćemo vodiču naučiti kako ukloniti dvostruke retke u MySQL bazi podataka kako bismo smanjili veličinu baze podataka i pomogli u povećanju performansi poslužitelja.







Prije nego nastavimo, pretpostavljamo:



  1. Na vašem sustavu imate instaliran i pokrenut MySQL
  2. Imate root pristup bazi podataka.
  3. Imate pristup bazi podataka za eksperimentiranje ili testiranje

BILJEŠKA : Ako vam je potreban uzorak baze podataka za isprobavanje koncepata navedenih u ovom vodiču, razmotrite bazu podataka Sakila ili preuzmite kopiju baze podataka koja se koristi u ovom vodiču.



Resursi su navedeni u nastavku:





Osnovna upotreba

Prije nego što počnemo, namjerno ćemo stvoriti tablicu koja sadrži duplicirane vrijednosti za potrebe testiranja. SQL upiti za izvršavanje ove radnje su dolje:

KORISTITI svijet;
PAD STOL AKO POSTOJI korisnika;
STVORITI STOL korisnika(iskaznica INT GLAVNI KLJUČ NE NULL AUTO_INCREMENT ,Korisničko ime VARCHAR (10) NE NULL ,puno ime VARCHAR (dvadeset),e -mail VARCHAR (255) NE NULL );
UMETNUTI U korisnika(Korisničko ime,puno ime,e -mail) VRIJEDNOSTI
('Djevica', 'Claude M. Mori', '[zaštićena e -pošta]'),
('pritisnite', 'Tiffany G. Bailey', '[zaštićena e -pošta]'),
('raketa', 'Christopher S. Payton', '[zaštićena e -pošta]'),
('tamna materija', 'Patricia J. Fox', '[zaštićena e -pošta]'),
('subjekt', 'Faye H. Hartley', '[zaštićena e -pošta]'),
('tamna materija', 'Patricia J. Fox', '[zaštićena e -pošta]'),
('raketa', 'Christopher S. Payton', '[zaštićena e -pošta]'),
('Artemis', 'Wesley C. Dillard', '[zaštićena e -pošta]');

Gore navedeni upit slobodno izmijenite tako da odgovara vašim potrebama. Također biste trebali osigurati da ste stvorili bazu podataka (svijet) kako biste izbjegli greške.



Sada, ako dobijemo sve podatke unutar tablice i poredamo ih prema korisničkom imenu, vidjet ćemo duplikate koje imamo kako je prikazano:

mysql> koristiti svijet;
Baza podataka promijenio
mysql> ODABERI * IZ korisnika NARUČI PO Korisničko ime;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|iskaznica|Korisničko ime|puno ime|e -mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |Artemis|Wesley C. Dillard|[zaštićena e -pošta]|
| 4 |mračna materija|Patricia J. Fox|[zaštićena e -pošta]|
| 6 |mračna materija|Patricia J. Fox|[zaštićena e -pošta]|
| 2 |pritisnite|Tiffany G. Bailey|[zaštićena e -pošta]|
| 5 |predmet|Faye H. Hartley|[zaštićena e -pošta]|
| 3 |raketa|Christopher S. Payton|[zaštićena e -pošta]|
| 7 |raketa|Christopher S. Payton|[zaštićena e -pošta]|
| 1 |Djevica|Claude M. Mori|[zaštićena e -pošta]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Kao što možete vidjeti iz gornje tablice, imamo dvije duplicirane vrijednosti koje bez ikakvog razloga povećavaju bazu podataka i uzrokuju male brzine.

Naučimo sada kako možemo ukloniti te vrijednosti.

#1 - IZBRIŠI JOIN

Jedan od načina za uklanjanje dupliciranih redaka u bazi podataka je upotreba izraza MySQL DELETE JOIN. Upit, međutim, koristi id -ove za uklanjanje dupliciranih vrijednosti.

Na primjer, za uklanjanje dupliciranih vrijednosti u gornjoj tablici korisnika možemo unijeti:

IZBRISATI stol 1 IZ tablica korisnika1 UNUTRAŠNJI PRIDRUŽITI tablica korisnika2 GDJE tablica1.id<tablica2.id I stol1.email=stol2.email;

Nakon što izvršite gornji upit, uklonit ćete dvostruke vrijednosti kako je prikazano u donjem ispisu:

mysql> IZBRISATI stol 1 IZ tablica korisnika1 UNUTRAŠNJI PRIDRUŽITI tablica korisnika2 GDJE tablica1.id<tablica2.id I stol1.email=stol2.email;
Upit u redu, 2zahvaćeni redovi(0,01sek)

mysql> ODABERI * IZ korisnika NARUČI PO Korisničko ime;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|iskaznica|Korisničko ime|puno ime|e -mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |Artemis|Wesley C. Dillard|[zaštićena e -pošta]|
| 6 |mračna materija|Patricia J. Fox|[zaštićena e -pošta]|
| 2 |pritisnite|Tiffany G. Bailey|[zaštićena e -pošta]|
| 5 |predmet|Faye H. Hartley|[zaštićena e -pošta]|
| 7 |raketa|Christopher S. Payton|[zaštićena e -pošta]|
| 1 |Djevica|Claude M. Mori|[zaštićena e -pošta]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Redak_Broj () Funkcija

Druga metoda koju možemo implementirati je korištenje funkcije MySQL row_number (). Ova je funkcija podržana u MySQL verziji 8 i novijim.

Radi tako što svakom retku dodjeljuje sekvencijalnu vrijednost int, pri čemu retci koji sadrže duplicirane vrijednosti dobivaju vrijednost veću od 1.

Da biste saznali više o ovoj funkciji, upotrijebite dolje navedene resurse:

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

Razmotrite donji upit koji vraća id redaka s dvostrukim vrijednostima:

ODABERI iskaznica IZ ( ODABERI iskaznica,ROW_NUMBER()NAD( PODJELA PO korisničkom imenu NARUČI PO Korisničko ime) KAO red_var IZ korisnika)t1 GDJE red_var> 1;

Nakon što izvršite gornji upit, trebali biste dobiti popis ID -ova kako je prikazano u donjem ispisu:

+ ---- +
|iskaznica|
+ ---- +
| 6 |
| 7 |
+ ---- +
2redove u postavljen (0,01sek)

Ako želite ukloniti vrijednosti, jednostavno zamijenite izraz SELECT izrazom DELETE kao što je prikazano u nastavku:

IZBRISATI IZ korisnika GDJE iskaznica U ( ODABERI iskaznica IZ ( ODABERI iskaznica,ROW_NUMBER()NAD( PODJELA PO korisničkom imenu NARUČI PO Korisničko ime) KAO red_var IZ korisnika)t1 GDJE red_var> 1);

Konačno, možete provjeriti jesu li se duplicirane vrijednosti uklonile pomoću izraza SELECT.

mysql> ODABERI * iz korisnika NARUČI PO Korisničko ime;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|iskaznica|Korisničko ime|puno ime|e -mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |Artemis|Wesley C. Dillard|[zaštićena e -pošta]|
| 4 |mračna materija|Patricia J. Fox|[zaštićena e -pošta]|
| 2 |pritisnite|Tiffany G. Bailey|[zaštićena e -pošta]|
| 5 |predmet|Faye H. Hartley|[zaštićena e -pošta]|
| 3 |raketa|Christopher S. Payton|[zaštićena e -pošta]|
| 1 |Djevica|Claude M. Mori|[zaštićena e -pošta]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Zaključak

U ovom smo vodiču raspravljali o dvije metode uklanjanja dupliciranih vrijednosti iz baze podataka. Velike baze podataka, osobito one koje se uobičajeno koriste, mogu sadržavati mnogo dupliciranih vrijednosti iz vanjskog uvoza i drugih pogrešaka. Stoga postoji potreba za nastavkom čišćenja dupliciranih vrijednosti kako bi se osiguralo optimalno funkcioniranje aplikacija.