Πώς η MySQL διαγράφει διπλές σειρές

How Mysql Delete Duplicate Rows



Το MySQL είναι ένα σχεσιακό σύνολο δεδομένων που αποθηκεύει δεδομένα σε πίνακες που έχουν γραμμές και στήλες. Ωστόσο, τα δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων μπορεί να περιέχουν διπλές τιμές που προκαλούνται από σφάλματα στις εφαρμογές ή τους χρήστες.

Σε αυτό το σεμινάριο, θα μάθουμε πώς να αφαιρούμε διπλές σειρές σε μια βάση δεδομένων MySQL για να μειώσουμε το μέγεθος της βάσης δεδομένων και να βοηθήσουμε στην αύξηση της απόδοσης του διακομιστή.







Πριν συνεχίσουμε, υποθέτουμε:



  1. Έχετε εγκαταστήσει και λειτουργεί το MySQL στο σύστημά σας
  2. Έχετε πρόσβαση root στη βάση δεδομένων.
  3. Έχετε πρόσβαση σε μια βάση δεδομένων για πειραματισμούς ή δοκιμές

ΣΗΜΕΙΩΣΗ : Εάν χρειάζεστε ένα δείγμα βάσης δεδομένων για να δοκιμάσετε τις έννοιες που παρέχονται σε αυτόν τον οδηγό, λάβετε υπόψη τη βάση δεδομένων Sakila ή κατεβάστε ένα αντίγραφο της βάσης δεδομένων που χρησιμοποιείται σε αυτόν τον οδηγό.



Οι πόροι παρέχονται παρακάτω:





Βασική Χρήση

Πριν ξεκινήσουμε, θα δημιουργήσουμε σκόπιμα έναν πίνακα που περιέχει διπλές τιμές για σκοπούς δοκιμής. Τα ερωτήματα SQL για την εκτέλεση αυτής της ενέργειας είναι τα παρακάτω:

ΧΡΗΣΗ κόσμος?
ΠΤΩΣΗ ΤΡΑΠΕΖΙ ΑΝ ΥΠΑΡΧΕΙ χρήστες?
ΔΗΜΙΟΥΡΓΩ ΤΡΑΠΕΖΙ χρήστες(ταυτότητα INT ΠΡΩΤΕΥΩΝ ΚΛΕΙΔΙ ΔΕΝ ΜΗΔΕΝΙΚΟ ΑΥΤΟΜΑΤΗ ΑΥΞΗΣΗ ,όνομα χρήστη VARCHAR (10) ΔΕΝ ΜΗΔΕΝΙΚΟ ,πλήρες όνομα VARCHAR (είκοσι),ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ VARCHAR (255) ΔΕΝ ΜΗΔΕΝΙΚΟ )?
ΕΙΣΑΓΕΤΕ ΣΕ χρήστες(όνομα χρήστη,πλήρες όνομα,ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ) ΑΞΙΕΣ
('Παρθένος', 'Claude M. Mori', '[email protected]'),
('τύπος', «Tiffany G. Bailey», '[email protected]'),
('ρουκέτα', 'Christopher S. Payton', '[email protected]'),
('σκοτεινή ύλη', 'Patricia J. Fox', '[email protected]'),
('θέμα', 'Faye H. Hartley', '[email protected]'),
('σκοτεινή ύλη', 'Patricia J. Fox', '[email protected]'),
('ρουκέτα', 'Christopher S. Payton', '[email protected]'),
('Άρτεμις', 'Wesley C. Dillard', '[email protected]')?

Μη διστάσετε να τροποποιήσετε το παραπάνω ερώτημα για να ταιριάζει στις ανάγκες σας. Θα πρέπει επίσης να διασφαλίσετε ότι έχετε δημιουργήσει τη βάση δεδομένων (κόσμο) για να αποφύγετε σφάλματα.



Τώρα, αν λάβουμε όλα τα δεδομένα μέσα στον πίνακα και με βάση το όνομα χρήστη, θα δούμε τα διπλότυπα που έχουμε, όπως φαίνεται:

mysql>> χρήση κόσμος?
Βάση δεδομένων άλλαξε
mysql>> ΕΠΙΛΕΓΩ * ΑΠΟ χρήστες ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ όνομα χρήστη?
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ταυτότητα|όνομα χρήστη|πλήρες όνομα|ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |Άρτεμις|Wesley C. Dillard|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 4 |σκοτεινή ύλη|Patricia J. Fox|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 6 |σκοτεινή ύλη|Patricia J. Fox|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 2 |τύπος|Tiffany G. Bailey|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 5 |θέμα|Faye H. Hartley|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 3 |ρουκέτα|Christopher S. Payton|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 7 |ρουκέτα|Christopher S. Payton|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 1 |Παρθένος|Claude M. Mori|[προστασία ηλεκτρονικού ταχυδρομείου]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Όπως μπορείτε να δείτε από τον παραπάνω πίνακα, έχουμε δύο διπλές τιμές που κάνουν τη βάση δεδομένων μεγαλύτερη χωρίς λόγο και προκαλούν αργές ταχύτητες.

Ας μάθουμε τώρα πώς μπορούμε να αφαιρέσουμε αυτές τις τιμές.

#1 - ΔΙΑΓΡΑΦΗ ΣΥΜΜΕΤΟΧΗΣ

Ένας τρόπος για να αφαιρέσετε διπλές σειρές σε μια βάση δεδομένων είναι να χρησιμοποιήσετε τη δήλωση MySQL DELETE JOIN. Το ερώτημα, ωστόσο, χρησιμοποιεί αναγνωριστικά για την κατάργηση διπλών τιμών.

Για παράδειγμα, για να καταργήσουμε τις διπλές τιμές στον παραπάνω πίνακα χρηστών, μπορούμε να εισάγουμε:

ΔΙΑΓΡΑΦΩ Τραπέζι 1 ΑΠΟ πίνακας χρηστών 1 ΕΣΩΤΕΡΙΚΟΣ ΣΥΜΜΕΤΟΧΗ πίνακας χρηστών2 ΟΠΟΥ table1.id<table2.id ΚΑΙ table1.email=table2.email?

Μόλις εκτελέσετε το παραπάνω ερώτημα, θα καταργήσετε τις διπλές τιμές όπως φαίνεται στην παρακάτω έξοδο:

mysql>> ΔΙΑΓΡΑΦΩ Τραπέζι 1 ΑΠΟ πίνακας χρηστών 1 ΕΣΩΤΕΡΙΚΟΣ ΣΥΜΜΕΤΟΧΗ πίνακας χρηστών2 ΟΠΟΥ table1.id<table2.id ΚΑΙ table1.email=table2.email?
Ερώτημα ΟΚ, 2σειρές που επηρεάζονται(0,01δευτ)

mysql>> ΕΠΙΛΕΓΩ * ΑΠΟ χρήστες ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ όνομα χρήστη?
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ταυτότητα|όνομα χρήστη|πλήρες όνομα|ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |Άρτεμις|Wesley C. Dillard|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 6 |σκοτεινή ύλη|Patricia J. Fox|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 2 |τύπος|Tiffany G. Bailey|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 5 |θέμα|Faye H. Hartley|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 7 |ρουκέτα|Christopher S. Payton|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 1 |Παρθένος|Claude M. Mori|[προστασία ηλεκτρονικού ταχυδρομείου]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Λειτουργία_Row_Number ()

Η δεύτερη μέθοδος που μπορούμε να εφαρμόσουμε είναι να χρησιμοποιήσουμε τη συνάρτηση MySQL row_number (). Αυτή η λειτουργία υποστηρίζεται στην έκδοση 8 και νεότερη έκδοση MySQL.

Λειτουργεί εκχωρώντας μια διαδοχική τιμή int σε κάθε γραμμή, με τις γραμμές που περιέχουν διπλές τιμές να αποκτούν μια τιμή μεγαλύτερη από 1.

Για να μάθετε περισσότερα σχετικά με αυτήν τη λειτουργία, χρησιμοποιήστε τον παρακάτω πόρο:

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

Εξετάστε το παρακάτω ερώτημα που επιστρέφει το αναγνωριστικό των γραμμών με διπλές τιμές:

ΕΠΙΛΕΓΩ ταυτότητα ΑΠΟ ( ΕΠΙΛΕΓΩ ταυτότητα,ROW_NUMBER()ΠΑΝΩ ΑΠΟ( ΧΩΡΙΣΜΑ ΜΕ όνομα χρήστη ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ όνομα χρήστη) ΟΠΩΣ ΚΑΙ row_var ΑΠΟ χρήστες)t1 ΟΠΟΥ row_var>> 1?

Μόλις εκτελέσετε το παραπάνω ερώτημα, θα πρέπει να λάβετε τη λίστα των αναγνωριστικών όπως φαίνεται στην παρακάτω έξοδο:

+ ---- +
|ταυτότητα|
+ ---- +
| 6 |
| 7 |
+ ---- +
2σειρές σε σειρά (0,01δευτ)

Εάν θέλετε να καταργήσετε τις τιμές, απλώς αντικαταστήστε τη δήλωση SELECT με τη δήλωση DELETE, όπως φαίνεται παρακάτω:

ΔΙΑΓΡΑΦΩ ΑΠΟ χρήστες ΟΠΟΥ ταυτότητα ΣΕ ( ΕΠΙΛΕΓΩ ταυτότητα ΑΠΟ ( ΕΠΙΛΕΓΩ ταυτότητα,ROW_NUMBER()ΠΑΝΩ ΑΠΟ( ΧΩΡΙΣΜΑ ΜΕ όνομα χρήστη ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ όνομα χρήστη) ΟΠΩΣ ΚΑΙ row_var ΑΠΟ χρήστες)t1 ΟΠΟΥ row_var>> 1)?

Τέλος, μπορείτε να επαληθεύσετε ότι οι διπλές τιμές καταργούνται χρησιμοποιώντας τη δήλωση SELECT.

mysql>> ΕΠΙΛΕΓΩ * από χρήστες ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ όνομα χρήστη?
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ταυτότητα|όνομα χρήστη|πλήρες όνομα|ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |Άρτεμις|Wesley C. Dillard|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 4 |σκοτεινή ύλη|Patricia J. Fox|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 2 |τύπος|Tiffany G. Bailey|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 5 |θέμα|Faye H. Hartley|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 3 |ρουκέτα|Christopher S. Payton|[προστασία ηλεκτρονικού ταχυδρομείου]|
| 1 |Παρθένος|Claude M. Mori|[προστασία ηλεκτρονικού ταχυδρομείου]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

συμπέρασμα

Σε αυτό το σεμινάριο, συζητήσαμε τις δύο μεθόδους κατάργησης διπλών τιμών από μια βάση δεδομένων. Οι μεγάλες βάσεις δεδομένων, ειδικά αυτές που χρησιμοποιούνται συχνά, ενδέχεται να περιέχουν πολλές διπλές τιμές από εξωτερικές εισαγωγές και άλλα σφάλματα. Επομένως, υπάρχει ανάγκη συνεχούς εκκαθάρισης διπλών τιμών για να διασφαλιστεί ότι οι εφαρμογές αποδίδουν με τον καλύτερο δυνατό τρόπο.