Cum MySQL șterge rândurile duplicate

How Mysql Delete Duplicate Rows



MySQL este un set de date relațional care stochează date în tabele care au rânduri și coloane. Cu toate acestea, datele stocate în baza de date pot conține valori duplicate cauzate de erori în aplicații sau utilizatori.

În acest tutorial, vom învăța cum să eliminăm rândurile duplicate dintr-o bază de date MySQL pentru a reduce dimensiunea bazei de date și pentru a ajuta la creșterea performanței serverului.







Înainte de a continua, presupunem:



  1. Aveți MySQL instalat și rulează pe sistemul dvs.
  2. Aveți acces root la baza de date.
  3. Aveți acces la o bază de date pentru experimentare sau testare

NOTĂ : Dacă aveți nevoie de un exemplu de bază de date pentru a încerca conceptele furnizate în acest ghid, vă rugăm să luați în considerare baza de date Sakila sau să descărcați o copie a bazei de date folosite în acest ghid.



Resursele sunt furnizate mai jos:





Utilizare de bază

Înainte de a începe, vom crea în mod intenționat un tabel care conține valori duplicat în scopul testării. Interogările SQL pentru a efectua această acțiune sunt mai jos:

UTILIZARE lume;
CĂDERE BRUSCA MASA DACĂ EXISTĂ utilizatori;
CREA MASA utilizatori(id INT CHEIA PRINCIPALA NU NUL AUTO_INCREMENT ,nume de utilizator VARCHAR (10) NU NUL ,Numele complet VARCHAR (douăzeci),e-mail VARCHAR (255) NU NUL );
INTRODUCE ÎN utilizatori(nume de utilizator,Numele complet,e-mail) VALORI
(„Fecioară”, „Claude M. Mori”, „[email protected]”),
('presa', „Tiffany G. Bailey”, „[email protected]”),
(„rachetă”, „Christopher S. Payton”, „[email protected]”),
('materie întunecată', „Patricia J. Fox”, „[email protected]”),
('subiect', „Faye H. Hartley”, „[email protected]”),
('materie întunecată', „Patricia J. Fox”, „[email protected]”),
(„rachetă”, „Christopher S. Payton”, „[email protected]”),
(„artemis”, „Wesley C. Dillard”, „[email protected]”);

Nu ezitați să modificați interogarea de mai sus pentru a se potrivi nevoilor dvs. De asemenea, trebuie să vă asigurați că aveți baza de date (lume) creată pentru a evita erorile.



Acum, dacă obținem toate datele din tabel și în ordine după numele de utilizator, vom vedea duplicatele pe care le avem așa cum se arată:

mysql> utilizare lume;
Bază de date schimbat
mysql> SELECTAȚI * DIN utilizatori COMANDA DE nume de utilizator;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|nume de utilizator|Numele complet|e-mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e-mail protejat]|
| 4 |materie întunecată|Patricia J. Fox|[e-mail protejat]|
| 6 |materie întunecată|Patricia J. Fox|[e-mail protejat]|
| 2 |presa|Tiffany G. Bailey|[e-mail protejat]|
| 5 |subiect|Faye H. Hartley|[e-mail protejat]|
| 3 |rachetă|Christopher S. Payton|[e-mail protejat]|
| 7 |rachetă|Christopher S. Payton|[e-mail protejat]|
| 1 |Fecioara|Claude M. Mori|[e-mail protejat]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

După cum puteți vedea din tabelul de mai sus, avem două valori duplicate care fac baza de date mai mare, fără niciun motiv și cauzează viteze mici.

Să învățăm acum cum putem elimina aceste valori.

# 1 - DELETE JOIN

O modalitate de a elimina rândurile duplicate dintr-o bază de date este utilizarea instrucțiunii MySQL DELETE JOIN. Cu toate acestea, interogarea folosește id-uri pentru a elimina valorile duplicate.

De exemplu, pentru a elimina valorile duplicate din tabelul utilizatorilor de mai sus, putem introduce:

ȘTERGE tabelul 1 DIN tabelul utilizatorilor1 INTERIOR A TE ALATURA tabelul utilizatorilor2 UNDE table1.id<table2.id ȘI table1.email=table2.email;

După ce executați interogarea de mai sus, veți elimina valorile duplicate așa cum se arată în rezultatul de mai jos:

mysql> ȘTERGE tabelul 1 DIN tabelul utilizatorilor1 INTERIOR A TE ALATURA tabelul utilizatorilor2 UNDE table1.id<table2.id ȘI table1.email=table2.email;
Interogare OK, 2rânduri afectate(0,01sec)

mysql> SELECTAȚI * DIN utilizatori COMANDA DE nume de utilizator;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|nume de utilizator|Numele complet|e-mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e-mail protejat]|
| 6 |materie întunecată|Patricia J. Fox|[e-mail protejat]|
| 2 |presa|Tiffany G. Bailey|[e-mail protejat]|
| 5 |subiect|Faye H. Hartley|[e-mail protejat]|
| 7 |rachetă|Christopher S. Payton|[e-mail protejat]|
| 1 |Fecioara|Claude M. Mori|[e-mail protejat]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

# 2 - Funcția Row_Number ()

A doua metodă pe care o putem implementa este să folosim funcția MySQL row_number (). Această funcție este acceptată în versiunea MySQL 8 și mai mare.

Funcționează prin atribuirea unei valori secvențiale fiecărui rând, cu rânduri care conțin valori duplicate obținând o valoare mai mare de 1.

Pentru a afla mai multe despre această funcție, utilizați resursa furnizată mai jos:

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

Luați în considerare interogarea de mai jos care returnează ID-ul rândurilor cu valori duplicat:

SELECTAȚI id DIN ( SELECTAȚI id,ROW_NUMBER()PESTE( PARTIȚIE BY nume de utilizator COMANDA DE nume de utilizator) LA FEL DE rând_var DIN utilizatori)t1 UNDE rând_var> 1;

După ce executați interogarea de mai sus, ar trebui să obțineți lista de id-uri așa cum se arată în rezultatul de mai jos:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2rânduri în a stabilit (0,01sec)

Dacă doriți să eliminați valorile, pur și simplu înlocuiți instrucțiunea SELECT cu instrucțiunea DELETE așa cum se arată mai jos:

ȘTERGE DIN utilizatori UNDE id ÎN ( SELECTAȚI id DIN ( SELECTAȚI id,ROW_NUMBER()PESTE( PARTIȚIE BY nume de utilizator COMANDA DE nume de utilizator) LA FEL DE rând_var DIN utilizatori)t1 UNDE rând_var> 1);

În cele din urmă, puteți verifica dacă valorile duplicate sunt eliminate folosind instrucțiunea SELECT.

mysql> SELECTAȚI * din utilizatori COMANDA DE nume de utilizator;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|nume de utilizator|Numele complet|e-mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[e-mail protejat]|
| 4 |materie întunecată|Patricia J. Fox|[e-mail protejat]|
| 2 |presa|Tiffany G. Bailey|[e-mail protejat]|
| 5 |subiect|Faye H. Hartley|[e-mail protejat]|
| 3 |rachetă|Christopher S. Payton|[e-mail protejat]|
| 1 |Fecioara|Claude M. Mori|[e-mail protejat]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Concluzie

În acest tutorial, am discutat despre cele două metode de eliminare a valorilor duplicate dintr-o bază de date. Bazele de date mari, în special cele utilizate în mod obișnuit, pot conține multe valori duplicate din importurile externe și alte erori. Prin urmare, este necesar să se continue curățarea valorilor duplicate pentru a se asigura că aplicațiile funcționează optim.