Paano MySQL Tanggalin ang Mga Dobleng Rows

How Mysql Delete Duplicate Rows



Ang MySQL ay isang pamanggit na dataset na nag-iimbak ng data sa mga talahanayan na may mga hilera at haligi. Gayunpaman, ang data na nakaimbak sa database ay maaaring maglaman ng mga duplicate na halagang sanhi ng mga pagkakamali sa mga application o gumagamit.

Sa tutorial na ito, matututunan namin kung paano alisin ang mga duplicate na hilera sa isang database ng MySQL upang mabawasan ang laki ng database at matulungan upang madagdagan ang pagganap ng server.







Bago kami magpatuloy, ipinapalagay namin:



  1. Mayroon kang naka-install na MySQL at tumatakbo sa iyong system
  2. Mayroon kang root access sa database.
  3. Mayroon kang access sa isang database para sa eksperimento o pagsubok

TANDAAN : Kung kailangan mo ng isang sample na database upang subukan ang mga konsepto na ibinigay sa gabay na ito, mangyaring isaalang-alang ang database ng Sakila o mag-download ng isang kopya ng database na ginamit sa gabay na ito.



Ang mga mapagkukunan ay ibinibigay sa ibaba:





Pangunahing Paggamit

Bago kami magsimula, sadyang lilikha kami ng isang talahanayan na naglalaman ng mga duplicate na halaga para sa mga layunin sa pagsubok. Ang mga query ng SQL upang maisagawa ang pagkilos na ito ay nasa ibaba:

PAGGAMIT mundo;
PATULOG TABLE KUNG EXISTS mga gumagamit;
LILIKHA TABLE mga gumagamit(id INT PANGUNAHING SUSI HINDI WALA AUTO_INCREMENT ,username VARCHAR (10) HINDI WALA ,buong pangalan VARCHAR (dalawampu),email VARCHAR (255) HINDI WALA );
INSERT SA mga gumagamit(username,buong pangalan,email) VALUES
('Virgo', 'Claude M. Mori', '[Protektado ang email]'),
('pindutin', 'Tiffany G. Bailey', '[Protektado ang email]'),
('rocket', 'Christopher S. Payton', '[Protektado ang email]'),
('darkmatter', 'Patricia J. Fox', '[Protektado ang email]'),
('paksa', 'Faye H. Hartley', '[Protektado ang email]'),
('darkmatter', 'Patricia J. Fox', '[Protektado ang email]'),
('rocket', 'Christopher S. Payton', '[Protektado ang email]'),
('artemis', 'Wesley C. Dillard', '[Protektado ang email]');

Huwag mag-atubiling baguhin ang query sa itaas upang magkasya sa iyong mga pangangailangan. Dapat mo ring tiyakin na mayroon kang database (mundo) na nilikha upang maiwasan ang mga pagkakamali.



Ngayon, kung makuha namin ang lahat ng data sa loob ng talahanayan at ayon sa pagkakasunud-sunod ng username, makikita namin ang mga duplicate na mayroon kami tulad ng ipinakita:

MySQL> gamitin mundo;
Database nagbago
MySQL> PUMILI * MULA SA mga gumagamit INIUTOS NI username;
+ ---- + ------------ + ----------------- + ------- ---------------- +
|id|username|buong pangalan|email|
+ ---- + ------------ + ----------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[protektado ng email]|
| 4 |darkmatter|Patricia J. Fox|[protektado ng email]|
| 6 |darkmatter|Patricia J. Fox|[protektado ng email]|
| 2 |pindutin|Tiffany G. Bailey|[protektado ng email]|
| 5 |paksa|Faye H. Hartley|[protektado ng email]|
| 3 |rocket|Christopher S. Payton|[protektado ng email]|
| 7 |rocket|Christopher S. Payton|[protektado ng email]|
| 1 |Virgo|Claude M. Mori|[protektado ng email]|
+ ---- + ------------ + ----------------- + ------- ---------------- +

Tulad ng nakikita mo mula sa talahanayan sa itaas, mayroon kaming dalawang mga duplicate na halaga na ginagawang mas malaki ang database nang walang dahilan at maging sanhi ng mabagal na bilis.

Alamin natin ngayon kung paano natin matatanggal ang mga halagang ito.

# 1 - TANGGALIN SUMALI

Ang isang paraan upang alisin ang mga dobleng hilera sa isang database ay ang paggamit ng pahayag ng MySQL TANGGAL NG SUMALI. Gayunpaman, ang query ay gumagamit ng mga id upang alisin ang mga duplicate na halaga.

Halimbawa, upang alisin ang mga duplicate na halaga sa talahanayan ng mga gumagamit sa itaas, maaari kaming mag-input:

TANGGALIN mesa1 MULA SA talahanayan ng mga gumagamit1 INNER SUMALI talahanayan ng mga gumagamit2 SAAN mesa1.id<mesa2.id AT mesa1.email=mesa2.email;

Kapag naipatupad mo na ang query sa itaas, aalisin mo ang mga duplicate na halaga tulad ng ipinakita sa output sa ibaba:

MySQL> TANGGALIN mesa1 MULA SA talahanayan ng mga gumagamit1 INNER SUMALI talahanayan ng mga gumagamit2 SAAN mesa1.id<mesa2.id AT mesa1.email=mesa2.email;
OK tanong, 2naapektuhan ang mga hilera(0.01seg)

MySQL> PUMILI * MULA SA mga gumagamit INIUTOS NI username;
+ ---- + ------------ + ----------------- + ------- ---------------- +
|id|username|buong pangalan|email|
+ ---- + ------------ + ----------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[protektado ng email]|
| 6 |darkmatter|Patricia J. Fox|[protektado ng email]|
| 2 |pindutin|Tiffany G. Bailey|[protektado ng email]|
| 5 |paksa|Faye H. Hartley|[protektado ng email]|
| 7 |rocket|Christopher S. Payton|[protektado ng email]|
| 1 |Virgo|Claude M. Mori|[protektado ng email]|
+ ---- + ------------ + ----------------- + ------- ---------------- +

# 2 - Row_Number () Pag-andar

Ang pangalawang pamamaraan na maaari naming ipatupad ay ang paggamit ng MySQL row_number () function. Ang pagpapaandar na ito ay suportado sa MySQL bersyon 8 at mas mataas.

Gumagana ito sa pamamagitan ng pagtatalaga ng isang sunud-sunod na int halaga sa bawat hilera, na may mga hilera na naglalaman ng mga duplicate na halaga na nakakakuha ng isang halaga na mas mataas sa 1.

Upang matuto nang higit pa tungkol sa pagpapaandar na ito, gamitin ang mapagkukunang ibinigay sa ibaba:

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

Isaalang-alang ang query sa ibaba na nagbabalik ng id ng mga hilera na may mga dobleng halaga:

PUMILI id MULA SA ( PUMILI id,ROW_NUMBER()TAPOS( HAHIRAP NG username INIUTOS NI username) AS row_var MULA SA mga gumagamit)t1 SAAN row_var> 1;

Kapag naipatupad mo na ang query sa itaas, dapat mong makuha ang listahan ng mga id tulad ng ipinakita sa output sa ibaba:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2mga hilera sa itakda (0.01seg)

Kung nais mong alisin ang mga halaga, palitan lamang ang PILIING pahayag ng pahayag na TANGGALIN tulad ng ipinakita sa ibaba:

TANGGALIN MULA SA mga gumagamit SAAN id SA ( PUMILI id MULA SA ( PUMILI id,ROW_NUMBER()TAPOS( HAHIRAP NG username INIUTOS NI username) AS row_var MULA SA mga gumagamit)t1 SAAN row_var> 1);

Panghuli, maaari mong i-verify na ang mga duplicate na halaga ay tinanggal gamit ang PILIPING pahayag.

MySQL> PUMILI * mula sa mga gumagamit INIUTOS NI username;
+ ---- + ------------ + ----------------- + ------- ---------------- +
|id|username|buong pangalan|email|
+ ---- + ------------ + ----------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[protektado ng email]|
| 4 |darkmatter|Patricia J. Fox|[protektado ng email]|
| 2 |pindutin|Tiffany G. Bailey|[protektado ng email]|
| 5 |paksa|Faye H. Hartley|[protektado ng email]|
| 3 |rocket|Christopher S. Payton|[protektado ng email]|
| 1 |Virgo|Claude M. Mori|[protektado ng email]|
+ ---- + ------------ + ----------------- + ------- ---------------- +

Konklusyon

Sa tutorial na ito, tinalakay namin ang dalawang pamamaraan ng pag-alis ng mga duplicate na halaga mula sa isang database. Ang mga malalaking database, lalo na ang mga karaniwang ginagamit, ay maaaring maglaman ng maraming mga duplicate na halaga mula sa panlabas na pag-import at iba pang mga error. Samakatuwid, kailangang panatilihin ang paglilinis ng mga duplicate na halaga upang matiyak na ang mga application ay mahusay na gumaganap.