Kā MySQL izdzēš dublētas rindas

How Mysql Delete Duplicate Rows



MySQL ir relāciju datu kopa, kas glabā datus tabulās, kurās ir rindas un kolonnas. Tomēr datu bāzē saglabātie dati var saturēt vērtību dublikātus, ko izraisījušas lietojumprogrammu vai lietotāju kļūdas.

Šajā apmācībā mēs uzzināsim, kā noņemt dublētas rindas MySQL datu bāzē, lai samazinātu datu bāzes lielumu un palīdzētu palielināt servera veiktspēju.







Pirms turpināt, mēs pieņemam:



  1. Jūsu sistēmā ir instalēta un darbojas MySQL
  2. Jums ir root piekļuve datu bāzei.
  3. Jums ir piekļuve datu bāzei eksperimentiem vai testēšanai

PIEZĪME : Ja jums ir nepieciešams datu bāzes paraugs, lai izmēģinātu šajā rokasgrāmatā sniegtos jēdzienus, lūdzu, apsveriet Sakila datu bāzi vai lejupielādējiet šajā rokasgrāmatā izmantotās datu bāzes kopiju.



Resursi ir sniegti zemāk:





Pamata lietošana

Pirms sākam, mēs apzināti izveidosim tabulu, kurā ir dublētas vērtības testēšanas nolūkos. SQL vaicājumi šīs darbības veikšanai ir šādi:

LIETOT pasaule;
DROP TABULA IF EKSISTĒ lietotājiem;
RADĪT TABULA lietotājiem(id INT PRIMĀRĀ ATSLĒGTA NULL AUTO_INCREMENT ,lietotājvārds VARCHAR (10) NULL ,pilnais vārds VARCHAR (divdesmit),e -pastu VARCHAR (255) NULL );
IEVIETOT INTO lietotājiem(lietotājvārds,pilnais vārds,e -pastu) VĒRTĪBAS
('Jaunava', 'Klods M. Mori', '[aizsargāts ar e -pastu]'),
('prese', 'Tifānija G. Beilija', '[aizsargāts ar e -pastu]'),
('raķete', 'Kristofers S. Peitons', '[aizsargāts ar e -pastu]'),
('tumšā matērija', 'Patrīcija Dž. Foksa', '[aizsargāts ar e -pastu]'),
('priekšmets', 'Faye H. Hartley', '[aizsargāts ar e -pastu]'),
('tumšā matērija', 'Patrīcija Dž. Foksa', '[aizsargāts ar e -pastu]'),
('raķete', 'Kristofers S. Peitons', '[aizsargāts ar e -pastu]'),
('Artēmijs', 'Veslijs C. Dilards', '[aizsargāts ar e -pastu]');

Jūtieties brīvi mainīt iepriekš minēto vaicājumu atbilstoši savām vajadzībām. Jums arī jāpārliecinās, ka datubāze (pasaule) ir izveidota, lai izvairītos no kļūdām.



Tagad, ja tabulā iegūsim visus datus un pēc lietotājvārda, mēs redzēsim mūsu dublikātus, kā parādīts:

mysql> izmantot pasaule;
Datu bāze mainīts
mysql> SELECT * NO lietotājiem SAKĀRTOT PĒC lietotājvārds;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|lietotājvārds|pilnais vārds|e -pastu|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artēmijs|Veslijs C. Dilards|[pasts aizsargāts]|
| 4 |tumšā matērija|Patrīcija Dž. Foksa|[pasts aizsargāts]|
| 6 |tumšā matērija|Patrīcija Dž. Foksa|[pasts aizsargāts]|
| 2 |nospiediet|Tifānija G. Beilija|[pasts aizsargāts]|
| 5 |priekšmets|Faye H. Hartley|[pasts aizsargāts]|
| 3 |raķete|Kristofers S. Peitons|[pasts aizsargāts]|
| 7 |raķete|Kristofers S. Peitons|[pasts aizsargāts]|
| 1 |Jaunava|Klods M. Mori|[pasts aizsargāts]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Kā redzat iepriekšējā tabulā, mums ir divas dublikātu vērtības, kas bez iemesla padara datubāzi lielāku un izraisa lēnu ātrumu.

Tagad uzzināsim, kā šīs vērtības noņemt.

#1 - DZĒST PIEVIENOTIES

Viens veids, kā datu bāzē noņemt dublētas rindas, ir izmantot MySQL DELETE JOIN priekšrakstu. Tomēr vaicājumā tiek izmantoti ID, lai noņemtu dublikātu vērtības.

Piemēram, lai iepriekš esošajā lietotāju tabulā noņemtu vērtību dublikātus, mēs varam ievadīt:

DZĒST 1. tabula NO lietotāju tabula1 IEKŠĒJAIS PIEVIENOTIES lietotāju tabula2 KUR tabula1.id<tabula2.id UN tabula1.e -pasts=tabula2.e -pasts;

Kad esat izpildījis iepriekš minēto vaicājumu, jūs noņemsiet vērtību dublikātus, kā parādīts zemāk redzamajā izvadā:

mysql> DZĒST 1. tabula NO lietotāju tabula1 IEKŠĒJAIS PIEVIENOTIES lietotāju tabula2 KUR tabula1.id<tabula2.id UN tabula1.e -pasts=tabula2.e -pasts;
Vaicājums OK, 2skartās rindas(0.01sek)

mysql> SELECT * NO lietotājiem SAKĀRTOT PĒC lietotājvārds;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|lietotājvārds|pilnais vārds|e -pastu|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artēmijs|Veslijs C. Dilards|[pasts aizsargāts]|
| 6 |tumšā matērija|Patrīcija Dž. Foksa|[pasts aizsargāts]|
| 2 |nospiediet|Tifānija G. Beilija|[pasts aizsargāts]|
| 5 |priekšmets|Faye H. Hartley|[pasts aizsargāts]|
| 7 |raķete|Kristofers S. Peitons|[pasts aizsargāts]|
| 1 |Jaunava|Klods M. Mori|[pasts aizsargāts]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Rindas_numurs () Funkcija

Otra metode, ko varam ieviest, ir izmantot funkciju MySQL row_number (). Šī funkcija tiek atbalstīta MySQL 8. un jaunākās versijās.

Tas darbojas, katrai rindai piešķirot secīgu int vērtību, un rindas, kurās ir dublētas vērtības, iegūst vērtību, kas lielāka par 1.

Lai uzzinātu vairāk par šo funkciju, izmantojiet tālāk norādīto resursu.

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

Apsveriet tālāk esošo vaicājumu, kas atgriež rindu ID ar dublikātu vērtībām:

SELECT id NO ( SELECT id,ROW_NUMBER()BEIDZOT( DAĻA PĒC lietotājvārda SAKĀRTOT PĒC lietotājvārds) AS row_var NO lietotājiem)t1 KUR row_var> 1;

Kad esat izpildījis iepriekš minēto vaicājumu, jums vajadzētu iegūt ID sarakstu, kā parādīts zemāk redzamajā izvadā:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2rindas iekšā komplekts (0.01sek)

Ja vēlaties noņemt vērtības, vienkārši nomainiet paziņojumu SELECT ar paziņojumu DELETE, kā parādīts zemāk:

DZĒST NO lietotājiem KUR id IN ( SELECT id NO ( SELECT id,ROW_NUMBER()BEIDZOT( DAĻA PĒC lietotājvārda SAKĀRTOT PĒC lietotājvārds) AS row_var NO lietotājiem)t1 KUR row_var> 1);

Visbeidzot, varat pārbaudīt, vai dublētās vērtības tiek noņemtas, izmantojot SELECT priekšrakstu.

mysql> SELECT * no lietotājiem SAKĀRTOT PĒC lietotājvārds;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|lietotājvārds|pilnais vārds|e -pastu|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artēmijs|Veslijs C. Dilards|[pasts aizsargāts]|
| 4 |tumšā matērija|Patrīcija Dž. Foksa|[pasts aizsargāts]|
| 2 |nospiediet|Tifānija G. Beilija|[pasts aizsargāts]|
| 5 |priekšmets|Faye H. Hartley|[pasts aizsargāts]|
| 3 |raķete|Kristofers S. Peitons|[pasts aizsargāts]|
| 1 |Jaunava|Klods M. Mori|[pasts aizsargāts]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Secinājums

Šajā apmācībā mēs apspriedām divas metodes, kā noņemt datu bāzes dublikātus. Lielās datu bāzēs, jo īpaši tajās, kuras tiek plaši izmantotas, var būt daudz ārēju importu un citu kļūdu vērtību. Tāpēc ir jāturpina iztīrīt dublētās vērtības, lai nodrošinātu lietojumprogrammu optimālu darbību.