Kaip „MySQL“ ištrina pasikartojančias eilutes

How Mysql Delete Duplicate Rows



„MySQL“ yra santykių duomenų rinkinys, kuriame duomenys saugomi lentelėse, kuriose yra eilutės ir stulpeliai. Tačiau duomenų bazėje saugomuose duomenyse gali būti pasikartojančių verčių, kurias sukėlė programų ar vartotojų klaidos.

Šioje pamokoje sužinosime, kaip pašalinti pasikartojančias eilutes „MySQL“ duomenų bazėje, siekiant sumažinti duomenų bazės dydį ir padėti padidinti serverio našumą.





Prieš tęsdami darome prielaidą:



  1. Jūsų sistemoje įdiegta ir veikia „MySQL“
  2. Jūs turite root prieigą prie duomenų bazės.
  3. Turite prieigą prie duomenų bazės eksperimentams ar bandymams

PASTABA : Jei jums reikia duomenų bazės pavyzdžio, kad galėtumėte išbandyti šiame vadove pateiktas sąvokas, apsvarstykite „Sakila“ duomenų bazę arba atsisiųskite šiame vadove naudojamos duomenų bazės kopiją.



Ištekliai pateikti žemiau:





Pagrindinis naudojimas

Prieš pradėdami, mes tyčia sukursime lentelę, kurioje bus pasikartojančios vertės testavimo tikslais. SQL užklausos šiam veiksmui atlikti yra šios:

NAUDOTI pasaulis;
DROP LENTELĖ JEI EKSISTUOJA vartotojų;
KURTI LENTELĖ vartotojų(id INT PAGRINDINIS RAKTAS NE NULL AUTO_INCREMENT ,Vartotojo vardas VARCHAR (10) NE NULL ,pilnas vardas VARCHAR (dvidešimt),paštą VARCHAR (255) NE NULL );
ĮDĖTI Į vartotojų(Vartotojo vardas,pilnas vardas,paštą) VERTYBĖS
('Mergelė', „Claude M. Mori“, '[apsaugotas el. paštas]'),
('paspausti', „Tiffany G. Bailey“, '[apsaugotas el. paštas]'),
('raketa', „Christopheris S. Paytonas“, '[apsaugotas el. paštas]'),
('Juodoji medžiaga', „Patricia J. Fox“, '[apsaugotas el. paštas]'),
('tema', „Faye H. Hartley“, '[apsaugotas el. paštas]'),
('Juodoji medžiaga', „Patricia J. Fox“, '[apsaugotas el. paštas]'),
('raketa', „Christopheris S. Paytonas“, '[apsaugotas el. paštas]'),
('Artemis', „Wesley C. Dillard“, '[apsaugotas el. paštas]');

Nedvejodami pakeiskite aukščiau pateiktą užklausą, kad ji atitiktų jūsų poreikius. Taip pat turėtumėte įsitikinti, kad sukūrėte duomenų bazę (pasaulį), kad išvengtumėte klaidų.



Dabar, jei gausime visus duomenis lentelėje ir pagal vartotojo vardą, pamatysime dublikatus, kuriuos turime, kaip parodyta:

mysql> naudoti pasaulis;
Duomenų bazė pasikeitė
mysql> PASIRINKTI * NUO vartotojų RŪŠIUOTI PAGAL Vartotojo vardas;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|Vartotojo vardas|pilnas vardas|paštą|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemidė|Wesley C. Dillardas|[apsaugotas el. paštas]|
| 4 |Juodoji medžiaga|Patricia J. Fox|[apsaugotas el. paštas]|
| 6 |Juodoji medžiaga|Patricia J. Fox|[apsaugotas el. paštas]|
| 2 |paspauskite|Tiffany G. Bailey|[apsaugotas el. paštas]|
| 5 |tema|Faye H. Hartley|[apsaugotas el. paštas]|
| 3 |raketa|Christopheris S. Paytonas|[apsaugotas el. paštas]|
| 7 |raketa|Christopheris S. Paytonas|[apsaugotas el. paštas]|
| 1 |Mergelė|Claude M. Mori|[apsaugotas el. paštas]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Kaip matote iš aukščiau pateiktos lentelės, turime dvi pasikartojančias reikšmes, kurios be jokios priežasties padidina duomenų bazę ir sukelia lėtą greitį.

Dabar sužinokime, kaip galime pašalinti šias vertybes.

#1 - Ištrinti prisijungimą

Vienas iš būdų pašalinti pasikartojančias duomenų bazės eilutes yra naudoti MySQL DELETE JOIN sakinį. Tačiau užklausa naudoja ID, kad pašalintų pasikartojančias reikšmes.

Pavyzdžiui, norėdami pašalinti pasikartojančias reikšmes aukščiau esančioje naudotojų lentelėje, galime įvesti:

IŠTRINTI 1 lentelė NUO vartotojų lentelė1 VIDAUS JOIN vartotojų lentelė2 KUR lentelė1.id<table2.id IR lentelė1.paštas=lentelė2.paštas;

Vykdydami aukščiau pateiktą užklausą, pašalinsite pasikartojančias reikšmes, kaip parodyta žemiau esančiame išėjime:

mysql> IŠTRINTI 1 lentelė NUO vartotojų lentelė1 VIDAUS JOIN vartotojų lentelė2 KUR lentelė1.id<table2.id IR lentelė1.paštas=lentelė2.paštas;
Užklausa OK, 2paveiktos eilės(0.01sek)

mysql> PASIRINKTI * NUO vartotojų RŪŠIUOTI PAGAL Vartotojo vardas;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|Vartotojo vardas|pilnas vardas|paštą|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemidė|Wesley C. Dillardas|[apsaugotas el. paštas]|
| 6 |Juodoji medžiaga|Patricia J. Fox|[apsaugotas el. paštas]|
| 2 |paspauskite|Tiffany G. Bailey|[apsaugotas el. paštas]|
| 5 |tema|Faye H. Hartley|[apsaugotas el. paštas]|
| 7 |raketa|Christopheris S. Paytonas|[apsaugotas el. paštas]|
| 1 |Mergelė|Claude M. Mori|[apsaugotas el. paštas]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Row_Number () Funkcija

Antrasis metodas, kurį galime įgyvendinti, yra „MySQL row_number ()“ funkcijos naudojimas. Ši funkcija palaikoma 8 ir naujesnės versijos „MySQL“.

Tai veikia, kiekvienai eilutei priskiriant nuoseklią int vertę, o eilutės, kuriose yra pasikartojančių verčių, gauna didesnę nei 1 reikšmę.

Norėdami sužinoti daugiau apie šią funkciją, naudokite toliau pateiktą šaltinį:

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

Apsvarstykite toliau pateiktą užklausą, kuri grąžina eilučių su pasikartojančiomis reikšmėmis ID:

PASIRINKTI id NUO ( PASIRINKTI id,ROW_NUMBER()PABAIGA( DALIS PAGAL vartotojo vardą RŪŠIUOTI PAGAL Vartotojo vardas) AS eilutė_var NUO vartotojų)t1 KUR eilutė_var> 1;

Kai atliksite aukščiau pateiktą užklausą, turėtumėte gauti ID sąrašą, kaip parodyta žemiau esančiame išėjime:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2eilutės į nustatyti (0.01sek)

Jei norite pašalinti reikšmes, tiesiog pakeiskite SELECT sakinį DELETE sakiniu, kaip parodyta žemiau:

IŠTRINTI NUO vartotojų KUR id IN ( PASIRINKTI id NUO ( PASIRINKTI id,ROW_NUMBER()PABAIGA( DALIS PAGAL vartotojo vardą RŪŠIUOTI PAGAL Vartotojo vardas) AS eilutė_var NUO vartotojų)t1 KUR eilutė_var> 1);

Galiausiai galite patikrinti, ar pasikartojančios vertės pašalintos naudojant SELECT sakinį.

mysql> PASIRINKTI * nuo vartotojų RŪŠIUOTI PAGAL Vartotojo vardas;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|Vartotojo vardas|pilnas vardas|paštą|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemidė|Wesley C. Dillardas|[apsaugotas el. paštas]|
| 4 |Juodoji medžiaga|Patricia J. Fox|[apsaugotas el. paštas]|
| 2 |paspauskite|Tiffany G. Bailey|[apsaugotas el. paštas]|
| 5 |tema|Faye H. Hartley|[apsaugotas el. paštas]|
| 3 |raketa|Christopheris S. Paytonas|[apsaugotas el. paštas]|
| 1 |Mergelė|Claude M. Mori|[apsaugotas el. paštas]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Išvada

Šioje pamokoje aptarėme du pasikartojančių verčių pašalinimo iš duomenų bazės metodus. Didelėse duomenų bazėse, ypač bendrai naudojamose, gali būti daug pasikartojančių verčių iš išorinio importo ir kitų klaidų. Todėl reikia nuolat valyti pasikartojančias vertes, kad programos veiktų optimaliai.