Kuidas MySQL dubleerivaid ridu kustutab?

How Mysql Delete Duplicate Rows



MySQL on relatsiooniline andmekogum, mis salvestab andmed tabelites, kus on read ja veerud. Andmebaasi salvestatud andmed võivad aga sisaldada topeltväärtusi, mis on põhjustatud rakenduste või kasutajate vigade tõttu.

Selles õpetuses õpime, kuidas eemaldada duplikaatridu MySQL -i andmebaasist, et vähendada andmebaasi suurust ja aidata suurendada serveri jõudlust.







Enne jätkamist eeldame:



  1. Teie arvutisse on installitud ja töötab MySQL
  2. Teil on andmebaasile juurjuurdepääs.
  3. Teil on juurdepääs andmebaasile katsetamiseks või katsetamiseks

MÄRGE : Kui vajate selles juhendis esitatud mõistete proovimiseks andmebaasi näidist, kaaluge Sakila andmebaasi või laadige alla selles juhendis kasutatud andmebaasi koopia.



Ressursid on toodud allpool:





Põhikasutus

Enne alustamist loome testimiseks tahtlikult tabeli, mis sisaldab duplikaatväärtusi. Selle toimingu tegemiseks on SQL -päringud järgmised:

KASUTA maailma;
DROP TABEL KUI OLEMAS kasutajatele;
LOO TABEL kasutajatele(id INT ESIMENE VÕTTE MITTE NULL AUTO_INCREMENT ,kasutajanimi VARCHAR (10) MITTE NULL ,täisnimi VARCHAR (kakskümmend),meilile VARCHAR (255) MITTE NULL );
SISESTA SISSE kasutajatele(kasutajanimi,täisnimi,meilile) VÄÄRTUSED
('Neitsi', 'Claude M. Mori', '[email protected]'),
('vajutage', 'Tiffany G. Bailey', '[email protected]'),
('rakett', 'Christopher S. Payton', '[email protected]'),
('tumeaine', 'Patricia J. Fox', '[email protected]'),
('teema', 'Faye H. Hartley', '[email protected]'),
('tumeaine', 'Patricia J. Fox', '[email protected]'),
('rakett', 'Christopher S. Payton', '[email protected]'),
('artemis', 'Wesley C. Dillard', '[email protected]');

Muutke julgelt ülaltoodud päringut vastavalt oma vajadustele. Samuti peaksite vigade vältimiseks tagama andmebaasi (maailma) loomise.



Nüüd, kui saame kõik andmed tabelisse ja kasutajanime järgi, näeme duplikaate, nagu meil on näidatud:

mysql> kasutada maailma;
Andmebaas muutunud
mysql> VALI * Alates kasutajatele TELLI kasutajanimi;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|kasutajanimi|täisnimi|meilile|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -post kaitstud]|
| 4 |tumeaine|Patricia J. Fox|[e -post kaitstud]|
| 6 |tumeaine|Patricia J. Fox|[e -post kaitstud]|
| 2 |vajutage|Tiffany G. Bailey|[e -post kaitstud]|
| 5 |teema|Faye H. Hartley|[e -post kaitstud]|
| 3 |rakett|Christopher S. Payton|[e -post kaitstud]|
| 7 |rakett|Christopher S. Payton|[e -post kaitstud]|
| 1 |Neitsi|Claude M. Mori|[e -post kaitstud]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Nagu ülaltoodud tabelist näha, on meil kaks duplikaatväärtust, mis muudavad andmebaasi ilma põhjuseta suuremaks ja põhjustavad aeglast kiirust.

Nüüd õpime, kuidas neid väärtusi eemaldada.

#1 - KUSTUTA LIITU

Üks võimalus topelt ridade eemaldamiseks andmebaasis on kasutada MySQL DELETE JOIN avaldust. Päring aga kasutab duplikaatväärtuste eemaldamiseks ID -sid.

Näiteks ülaltoodud kasutajate tabeli topeltväärtuste eemaldamiseks võime sisestada:

KUSTUTA Tabel 1 Alates kasutajate tabel 1 SISEMINE LIITU kasutajate tabel2 KUS tabel1.id<tabel2.id JA tabel1.email=tabel2.email;

Kui olete ülaltoodud päringu täitnud, eemaldate duplikaatväärtused, nagu on näidatud allolevas väljundis:

mysql> KUSTUTA Tabel 1 Alates kasutajate tabel 1 SISEMINE LIITU kasutajate tabel2 KUS tabel1.id<tabel2.id JA tabel1.email=tabel2.email;
Päring OK, 2mõjutatud read(0,01sek)

mysql> VALI * Alates kasutajatele TELLI kasutajanimi;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|kasutajanimi|täisnimi|meilile|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -post kaitstud]|
| 6 |tumeaine|Patricia J. Fox|[e -post kaitstud]|
| 2 |vajutage|Tiffany G. Bailey|[e -post kaitstud]|
| 5 |teema|Faye H. Hartley|[e -post kaitstud]|
| 7 |rakett|Christopher S. Payton|[e -post kaitstud]|
| 1 |Neitsi|Claude M. Mori|[e -post kaitstud]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Funktsioon Row_Number ()

Teine meetod, mida saame rakendada, on kasutada funktsiooni MySQL row_number (). Seda funktsiooni toetab MySQL versioon 8 ja uuemad.

See toimib, määrates igale reale järjestikuse int -väärtuse, kusjuures duplikaatväärtusi sisaldavad read saavad väärtuse üle 1.

Selle funktsiooni kohta lisateabe saamiseks kasutage alltoodud ressurssi:

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

Mõelge allpool olevale päringule, mis tagastab duplikaatväärtustega ridade id:

VALI id Alates ( VALI id,ROW_NUMBER()LÕPPENUD( OSA Kasutajanime järgi TELLI kasutajanimi) AS row_var Alates kasutajatele)t1 KUS row_var> 1;

Kui olete ülaltoodud päringu täitnud, peaksite saama ID -de loendi, nagu on näidatud allolevas väljundis:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2ridu sisse seatud (0,01sek)

Kui soovite väärtused eemaldada, asendage SELECT -lause lihtsalt DELETE -lausega, nagu allpool näidatud:

KUSTUTA Alates kasutajatele KUS id IN ( VALI id Alates ( VALI id,ROW_NUMBER()LÕPPENUD( OSA Kasutajanime järgi TELLI kasutajanimi) AS row_var Alates kasutajatele)t1 KUS row_var> 1);

Lõpuks saate kontrollida, kas duplikaatväärtused on eemaldatud, kasutades lauset SELECT.

mysql> VALI * alates kasutajatele TELLI kasutajanimi;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|kasutajanimi|täisnimi|meilile|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e -post kaitstud]|
| 4 |tumeaine|Patricia J. Fox|[e -post kaitstud]|
| 2 |vajutage|Tiffany G. Bailey|[e -post kaitstud]|
| 5 |teema|Faye H. Hartley|[e -post kaitstud]|
| 3 |rakett|Christopher S. Payton|[e -post kaitstud]|
| 1 |Neitsi|Claude M. Mori|[e -post kaitstud]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Järeldus

Selles õpetuses arutasime kahte meetodit, kuidas andmebaasist duplikaatväärtusi eemaldada. Suured andmebaasid, eriti üldkasutatavad, võivad sisaldada paljusid duplikaatväärtusi, mis tulenevad välisest impordist ja muudest vigadest. Seetõttu on vaja jätkata duplikaatväärtuste puhastamist, et tagada rakenduste optimaalne toimimine.