mysql delete statement delete command syntax
Αυτό το σεμινάριο εξηγεί πώς να χρησιμοποιήσετε τη δήλωση ΔΙΑΓΡΑΦΗ MySQL για να διαγράψετε δεδομένα από έναν πίνακα ή να διαγράψετε ολόκληρο τον πίνακα & διαφορά μεταξύ εντολών περικοπής και διαγραφής:
Στη MySQL, το DELETE είναι μια γλώσσα χειρισμού δεδομένων ή DML, όπως γνωρίζουμε.
Όπως υποδηλώνει το ίδιο το όνομα, η εντολή χρησιμοποιείται για τη διαγραφή σειρών από τον πίνακα. Χρησιμοποιώντας αυτήν την εντολή, μπορούμε να διαγράψουμε μία ή περισσότερες ανεπιθύμητες σειρές σε μία μόνο συναλλαγή. Υπάρχουν πολλοί τρόποι διαγραφής εγγραφών από έναν πίνακα χρησιμοποιώντας την εντολή DELETE.
πώς να ανοίξετε ένα αρχείο βάζου με java
Σε αυτό το σεμινάριο, θα τα συζητήσουμε όλα αυτά λεπτομερώς μαζί με απλά παραδείγματα.
Τι θα μάθετε:
- Εντολή MySQL DELETE
- Διαφορά μεταξύ των δηλώσεων TRUNCATE και DELETE
- Αναφερόμενη ακεραιότητα και ο αντίκτυπός της στο DELETE
- Συχνές Ερωτήσεις και Απαντήσεις
- συμπέρασμα
Εντολή MySQL DELETE
Υπάρχει ένας σημαντικός παράγοντας που πρέπει να θυμάστε πριν προχωρήσουμε μπροστά. Οποιαδήποτε σειρά ή πολλές σειρές που διαγράφουμε χρησιμοποιώντας την εντολή DELETE δεν μπορεί ποτέ να ανακτηθεί.
Έτσι, για να αποφευχθούν σενάρια όπου μια σειρά διαγράφεται κατά λάθος, συνιστάται να λάβετε ένα αντίγραφο ασφαλείας του πίνακα πριν εκτελέσετε τη δήλωση DELETE. Μπορούμε αργότερα να χρησιμοποιήσουμε αυτό το αντίγραφο ασφαλείας για να επαναφέρουμε τον πίνακα σε περίπτωση λάθους.
Σημείωση: Χρησιμοποιούμε MySQL έκδοση 8.0. Μπορείτε να το κατεβάσετε από εδώ .
Σύνταξη διαγραφής MySQL:
DELETE (LOW_PRIORITY) (QUICK) (IGNORE) FROM tablename(.*) (, tablename(.*)) (WHERE condition) (ORDER BY) (LIMIT row_count) ;
Επεξήγηση σύνταξης:
- Η σύνταξη ξεκινά με τη λέξη-κλειδί 'ΔΙΑΓΡΑΦΗ ΑΠΟ', ενημερώνοντας έτσι τον MySQL Server για τον τύπο δραστηριότητας που θα εκτελεστεί. Αυτή είναι μια υποχρεωτική λέξη-κλειδί και δεν μπορεί να παραλειφθεί.
- Στη συνέχεια έρχεται το όνομα του πίνακα στον οποίο πρέπει να εκτελεστεί η λειτουργία DELETE. Αυτό είναι επίσης υποχρεωτικό και δεν μπορεί να παραλειφθεί. Μπορούμε να αναφέρουμε ένα ή περισσότερα ονόματα πινάκων εδώ.
- Στη συνέχεια, μπορούμε να αναφέρουμε οποιαδήποτε συνθήκη που ελέγχει την επιλεξιμότητα των γραμμών που πρέπει να διαγραφούν. Αυτή είναι μια προαιρετική ρήτρα. Η λέξη-κλειδί εδώ είναι που.
- Ακολουθείται από τον όρο WHERE είναι ο όρος ORDER BY, ο οποίος επιβάλλει τις γραμμές που πρέπει να διαγραφούν με μια συγκεκριμένη σειρά, είτε αύξουσα είτε φθίνουσα, σε μια στήλη (ες). Αυτή είναι μια προαιρετική ρήτρα.
- Ο όρος LIMIT ακολουθεί τον όρο ORDER BY. Βάζει ένα όριο στον αριθμό γραμμών που μπορεί να καταργήσει η δήλωση DELETE από τον πίνακα.
Τροποποιητές στη δήλωση DELETE
# 1) LOW_PRIORITY:
Αυτός ο τροποποιητής ενημερώνει τη Μηχανή MySQL για να καθυστερήσει την εκτέλεση της δήλωσης DELETE έως ότου δεν υπάρχουν συνδέσεις ανάγνωσης από τον πίνακα από τον οποίο προσπαθούμε να διαγράψουμε.
Αυτό βοηθά στην επίτευξη συνοχής σε όλες τις άλλες λειτουργίες που θα εκτελεστούν σε αυτόν τον πίνακα. Αυτό βοηθά επίσης στην αποφυγή προβλημάτων κλειδώματος πίνακα.
# 2) ΓΡΗΓΟΡΑ:
Κάθε φορά που διαγράφουμε μια σειρά, το αντίστοιχο ευρετήριο διαγράφεται επίσης. Η ανάκτηση του χώρου κατά τη στιγμή της εκτέλεσης της δήλωσης DELETE καταναλώνει το χρόνο του επεξεργαστή. Εάν χρησιμοποιήσουμε τη λέξη-κλειδί QUICK, τότε ο αντίστοιχος χώρος ευρετηρίου παραμένει αχρησιμοποίητος και μπορεί να χρησιμοποιηθεί όταν εισάγονται νέες εγγραφές που ταιριάζουν στο εύρος ευρετηρίου που διαγράφηκε νωρίτερα.
Για παράδειγμα, Σκεφτείτε έναν πίνακα υπαλλήλων όπου το ευρετήριο εργαζομένου είναι το ευρετήριο. Κάθε φορά που ένας υπάλληλος εγκαταλείπει έναν οργανισμό, πρέπει να διαγράψουμε την αντίστοιχη εγγραφή. Εάν χρησιμοποιήσουμε τον όρο QUICK τότε ο αντίστοιχος χώρος ευρετηρίου θα παραμείνει αχρησιμοποίητος.
Όταν συμμετέχει ένας νέος υπάλληλος, θα πάρει έναν νέο αριθμό υπαλλήλου και όχι τον ίδιο αριθμό του ατόμου που έφυγε. Σε τέτοια παραδείγματα, δεν συνιστάται η χρήση QUICK.
Παράδειγμα διαγραφής MYSQL
Παρακάτω δίνεται ένα δείγμα πίνακα που δημιουργήθηκε στο MYSQL.
Όνομα σχήματος: ειρηνικός
Όνομα πίνακα: υπαλλήλους
Ονόματα στηλών:
empNum; Διατηρεί ακέραιες τιμές για τον αριθμό υπαλλήλου.
επίθετο: Διατηρεί τιμές varchar για το επώνυμο του υπαλλήλου.
όνομα: Διατηρεί τις τιμές varchar για το όνομα του υπαλλήλου.
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: Διατηρεί τιμές varchar για το αναγνωριστικό email του υπαλλήλου.
deptNum; Διατηρεί το varchar για το αναγνωριστικό τμήματος στο οποίο ανήκει ένας υπάλληλος.
Μισθός: Διατηρεί τις δεκαδικές αξίες του μισθού κάθε υπαλλήλου.
ημερομηνία έναρξης: Διατηρεί τις τιμές ημερομηνίας για την ημερομηνία ένταξης του υπαλλήλου.
Όνομα σχήματος: ειρηνικός
Όνομα πίνακα: υπάλληλοι_ ιστορία
Ονόματα στηλών:
empNum; Διατηρεί τις ακέραιες τιμές για τον αριθμό υπαλλήλου.
επίθετο: Διατηρεί τιμές varchar για το επώνυμο του υπαλλήλου.
όνομα: Διατηρεί τις τιμές varchar για το όνομα του υπαλλήλου.
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: Διατηρεί τιμές varchar για το αναγνωριστικό email του υπαλλήλου.
deptNum; Διατηρεί το varchar για το αναγνωριστικό τμήματος στο οποίο ανήκει ένας υπάλληλος.
Μισθός: Διατηρεί τις δεκαδικές αξίες του μισθού κάθε υπαλλήλου.
ημερομηνία έναρξης: Διατηρεί τιμές ημερομηνίας για την ημερομηνία ένταξης του υπαλλήλου.
Όνομα σχήματος: ειρηνικός
Όνομα πίνακα: τμήματα
Ονόματα στηλών:
deptNum; Διατηρεί το varchar για το αναγνωριστικό τμήματος σε έναν οργανισμό.
πόλη: Κρατά το όνομα της πόλης από την οποία λειτουργούν τα τμήματα.
Χώρα: Κρατά το όνομα της χώρας που αντιστοιχεί στην πόλη.
δώρο: Διατηρεί την ποσοστιαία αξία του μπόνους.
MySQL Delete Single Row
Ο πρώτος και ευκολότερος τρόπος διαγραφής εγγραφών από τον πίνακα για τη διαγραφή των εγγραφών ένα προς ένα, χρησιμοποιώντας μια πολύ ισχυρή ρήτρα ΠΟΥ ΠΕΡΙΕΧΕΙ ότι διαγράφεται μόνο μία κατάλληλη εγγραφή. Αυτό θα μπορούσε να χρησιμοποιηθεί περαιτέρω για να διαγράψετε ένα σύνολο παρόμοιων ειδών σειρών από τον πίνακα.
Ας δούμε λεπτομερώς τη δήλωση διαγραφής και την εκτέλεσή της.
Εδώ θα προσπαθήσουμε να αφαιρέσουμε έναν υπάλληλο με το όνομα «Chris Nolan» με τον αριθμό υπαλλήλου ως 1013.
Όπως απεικονίζεται στην παραπάνω εικόνα, η δήλωση DELETE εκτελέστηκε με επιτυχία και διαγράφηκε μία σειρά από τον πίνακα του υπαλλήλου.
ο παραγωγή Η παρακάτω δήλωση δείχνει τον χρόνο εκτέλεσης της δήλωσης, τη δήλωση MySQL που εκτελέστηκε και τον αριθμό των σειρών που επηρεάστηκαν.
Παρακαλώ να είστε πολύ σίγουροι, σχετικά με τον όρο WHERE εδώ. Εάν η ρήτρα WHERE είναι λανθασμένη ή εάν χάσετε τη ρήτρα WHERE τότε μπορεί να οδηγήσει σε απώλεια δεδομένων. Για την αποφυγή τέτοιων καταστάσεων, στην παραγωγή, υπάρχει μια πρακτική περιοδικών αντιγράφων ασφαλείας ή εκφόρτωσης δεδομένων.
Για να επαληθεύσουμε την έξοδο αυτής της δήλωσης DELETE, ας εκτελέσουμε τη δήλωση SELECT σε αυτόν τον πίνακα με το empNum ως 1013.
Τα αποτελέσματα εξόδου δείχνουν τιμή NULL για όλες τις στήλες, υπονοώντας ότι δεν υπάρχει εγγραφή για ένα τέτοιο empNum. Η έξοδος του παρακάτω ερωτήματος δείχνει ότι έχουν επιστραφεί 0 σειρές, υποδηλώνοντας ότι η εγγραφή έχει διαγραφεί με την εκτέλεση της παραπάνω δήλωσης DELETE.
Ερώτηση:
DELETE FROM employees WHERE empNum = 1013 ;
Στιγμιότυπο πίνακα μετά:
empNum | επίθετο | όνομα | ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ | deptNum | Μισθός |
---|---|---|---|---|---|
7 | Αυτό είναι σχετικά αργό από το TRUNCATE, σε σύγκριση με τη διαγραφή ολόκληρων δεδομένων από τον πίνακα. | Αυτό είναι σχετικά πιο γρήγορο από το DELETE, σε σύγκριση με τη διαγραφή ολόκληρων δεδομένων από τον πίνακα. | |||
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ |
MySQL DELETE Χρησιμοποιώντας το ORDER BY και LIMIT Clause
ORDER BY και LIMIT είναι δύο ρήτρες που έχουμε συζητήσει παραπάνω. Το πρώτο βοηθά στον καθορισμό της σειράς με την οποία θα πρέπει να εκκαθαριστούν οι εγγραφές, είτε διαγράψτε εγγραφές με empNum σε αύξουσα είτε διαγράψτε εγγραφές με τον μισθό σε φθίνουσα σειρά. Το τελευταίο βοηθά στον περιορισμό του αριθμού των εγγραφών που μπορεί να διαγράψει αυτή η συναλλαγή.
Για παράδειγμα, αν θέλουμε να διαγράψουμε μόνο 2 υπαλλήλους που ανήκουν στο τμήμα 4, οι οποίοι είναι υψηλόβαθμοι. Στη συνέχεια, υπάρχουν τρία μέρη σε αυτό το ερώτημα.
- Πρώτα, πρέπει να απαλλαγούμε από τους υπαλλήλους από τον αριθμό 4. Αυτό θα αντιμετωπιστεί με μια ρήτρα WHERE.
- Επόμενο, πρέπει να καθαρίσουμε υπαλλήλους που κερδίζουν υψηλούς μισθούς. Αυτό θα αντιμετωπιστεί με τη ρήτρα ORDER BY στη στήλη μισθών με φθίνουσα σειρά.
- Εν τέλει, πρέπει να καθαρίσουμε μόνο δύο υπαλλήλους. Αυτό θα αντιμετωπιστεί με τη ρήτρα LIMIT.
Ας ρίξουμε μια ματιά στο ερώτημα DELETE και να δούμε τα αποτελέσματα. Πριν το πράξουμε, ας προσδιορίσουμε πρώτα ποιες είναι οι ακριβείς εγγραφές που θέλουμε να διαγράψουμε. Θα χρησιμοποιήσουμε τις παραπάνω συνθήκες με μια δήλωση SELECT για να λάβουμε τις εγγραφές που θέλουμε να διαγράψουμε και αργότερα να εκτελέσουμε το ίδιο ερώτημα για να επαληθεύσουμε εάν αυτές οι εγγραφές έχουν διαγραφεί ή όχι.
Στο παραπάνω ερώτημα SELECT, έχουμε ικανοποιήσει και τις τρεις προϋποθέσεις που συζητήσαμε παραπάνω χρησιμοποιώντας τη ρήτρα WHERE, ORDER BY και LIMIT. Το ερώτημα μας έδωσε 2 εγγραφές, μία με το empNum 1010 και μια άλλη με 1007. Τώρα, θα εκτελέσουμε το ερώτημα DELETE για να διασφαλίσουμε ότι αυτές οι δύο εγγραφές διαγράφονται.
Όπως απεικονίζεται στην παραπάνω εικόνα, η δήλωση DELETE εκτελέστηκε με επιτυχία και διέγραψε δύο σειρές από τον πίνακα του υπαλλήλου. ο παραγωγή Η παρακάτω δήλωση δείχνει τον χρόνο εκτέλεσης της δήλωσης, τη δήλωση MySQL που εκτελέστηκε και τον αριθμό των σειρών που επηρεάστηκαν.
Για να επαληθεύσουμε την έξοδο αυτής της δήλωσης DELETE, ας εκτελέσουμε το SELECT για empNum 1010 και 1007. Δεν μπορούμε να χρησιμοποιήσουμε το ίδιο ερώτημα SELECT όπως χρησιμοποιήθηκε παραπάνω με αυτό που θα έδειχνε στους άλλους υπαλλήλους στο deptNum 4.
για να αυξήσετε την ασφάλεια στο εσωτερικό δίκτυο της εταιρείας σας
Τα αποτελέσματα εξόδου δείχνουν τιμή NULL για όλες τις στήλες, υπονοώντας ότι δεν υπάρχει εγγραφή για τέτοιους αριθμούς υπαλλήλων. ο Παραγωγή του παρακάτω ερωτήματος δείχνει ότι έχουν επιστραφεί 0 σειρές, υποδηλώνοντας ότι η εγγραφή έχει διαγραφεί με την εκτέλεση της παραπάνω δήλωσης DELETE.
Ερώτηση:
DELETE FROM employees WHERE deptNum = 4 ORDER BY salary DESC LIMIT 2 ;
Στιγμιότυπο πίνακα μετά:
empNum | επίθετο | όνομα | ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ | deptNum | Μισθός |
---|---|---|---|---|---|
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ |
Διαγραφή MySQL Χρησιμοποιώντας Select Clause
Στη συνέχεια, θα εξετάσουμε τη χρήση του όρου SELECT, ενώ θα διαγράφουμε εγγραφές από έναν πίνακα.
Εξετάστε το ακόλουθο σενάριο:
Έχουμε δύο σύνολα πινάκων: εργαζόμενοι και τμήματα. Το deptNum είναι σαν ένα πρωτεύον κλειδί στον πίνακα του τμήματος και το ξένο κλειδί στον πίνακα του υπαλλήλου. Αυτό σημαίνει ότι εάν ένας υπάλληλος έχει ανατεθεί ένα τμήμα, τότε πρέπει να προέρχεται από ένα από τα τμήματα στον πίνακα των τμημάτων.
Τώρα, πρέπει να διαγράψουμε αυτές τις εγγραφές από τον πίνακα του τμήματος όπου μέχρι στιγμής δεν έχει ανατεθεί υπάλληλος. Μπορούμε να το κάνουμε αυτό έχοντας μια ρήτρα SELECT στο υπο-ερώτημα ενός ερωτήματος DELETE.
Ας εντοπίσουμε πρώτα τις εγγραφές που θέλουμε να διαγράψουμε:
Το παραπάνω ερώτημα SELECT έχει ένα ερώτημα.
Η λειτουργία ερωτήματος έχει ως εξής:
Το ερώτημα τραβάει όλες τις εγγραφές από τον πίνακα του τμήματος όπου το deptNum δεν υπάρχει στον πίνακα του υπαλλήλου. Η ένωση εκτελείται στο υπο-ερώτημα στο deptNum των δύο πινάκων.
Τώρα ας εκτελέσουμε το ερώτημα ΔΙΑΓΡΑΦΗ και να δούμε αν μπορούμε να διαγράψουμε αυτές τις δύο εγγραφές από τον πίνακα του τμήματος, καθώς κανένας υπάλληλος δεν έχει ανατεθεί σε αυτά τα τμήματα.
Όπως απεικονίζεται στην παραπάνω εικόνα, η δήλωση διαγραφής έχει διαγράψει 2 σειρές από τους πίνακες τμημάτων που δεν έχουν εκχωρηθεί υπάλληλος.
Για να επαληθεύσουμε την έξοδο αυτής της δήλωσης ΔΙΑΓΡΑΦΗ, ας εκτελέσουμε SELECT στον πίνακα και να δούμε τι έχουμε στην έξοδο.
Το μήνυμα εξόδου του παραπάνω ερωτήματος επαλήθευσης λέει 'επιστρέφονται 0 σειρές'. Αυτό σημαίνει ότι οι σειρές με deptNum 6 και 7 διαγράφονται. Η έξοδος επίσης δεν εμφανίζει εγγραφές αντί να δείχνει τιμές NULL καθώς οι εγγραφές έχουν διαγραφεί.
Ερώτηση:
DELETE FROM departments WHERE NOT EXISTS (SELECT deptNum FROM employees WHERE departments.deptNum = employees.deptNum ) ;
MySQL DELETE Ολόκληρα τα δεδομένα από τον πίνακα
Στη συνέχεια, θα δούμε το σενάριο όπου πρέπει να διαγράψουμε όλες τις σειρές ή τις εγγραφές από έναν πίνακα.
Στην κατάσταση παραγωγής, μπορεί να μην συναντήσετε ποτέ τέτοια κατάσταση. Αλλά αυτό το είδος θα απαιτηθεί στην περιοχή ανάπτυξης όπου πρέπει να δοκιμάσετε τον κώδικά σας με πολλά διαφορετικά σενάρια και ίσως θελήσετε να δημιουργήσετε ξανά ένα νέο σύνολο δεδομένων δοκιμής διαγράφοντας τις υπάρχουσες εγγραφές στον πίνακα.
Αρχικά, ας ρίξουμε μια ματιά στα δεδομένα που σκοπεύουμε να διαγράψουμε. Θα προσπαθήσουμε να διαγράψουμε δεδομένα από τον πίνακα των υπαλλήλων.
Δίνεται παρακάτω τα υπάρχοντα δεδομένα στον πίνακα.
Εδώ έχουμε 18 σειρές στον πίνακα υπαλλήλων_ ιστορίας. Ας προχωρήσουμε τώρα και διαγράψουμε όλα αυτά σε μία μόνο συναλλαγή. Το ερώτημα είναι σχεδόν παρόμοιο με αυτό που συζητήσαμε στην πρώτη ενότητα. Η μόνη αλλαγή είναι ότι πρέπει να καταργήσουμε τον όρο WHERE από το ερώτημα, έτσι ώστε να μην υπάρχει περιορισμός στον αριθμό των σειρών που θέλουμε να διαγράψουμε.
Όπως απεικονίζεται στην παραπάνω εικόνα, η δήλωση διαγραφής έχει εκτελεστεί με επιτυχία και έχει διαγράψει και τις 18 σειρές από τον πίνακα υπαλλήλων. Η παρακάτω δήλωση εξόδου δείχνει τον χρόνο εκτέλεσης της δήλωσης, τη δήλωση MySQL που εκτελέστηκε και τον αριθμό των σειρών που επηρεάστηκαν.
Για να επαληθεύσουμε την έξοδο αυτής της δήλωσης ΔΙΑΓΡΑΦΗ, ας εκτελέσουμε SELECT στον πίνακα και να δούμε τι έχουμε στην έξοδο.
Τα αποτελέσματα εξόδου δείχνουν τιμή NULL για όλες τις στήλες, υπονοώντας ότι δεν υπάρχει εγγραφή για τέτοιους αριθμούς υπαλλήλων. Η έξοδος του παρακάτω ερωτήματος δείχνει ότι έχουν επιστραφεί 0 σειρές, υποδηλώνοντας ότι όλες οι εγγραφές έχουν διαγραφεί με την εκτέλεση της παραπάνω δήλωσης DELETE.
Ερώτηση:
DELETE FROM employees_history ;
Στιγμιότυπο πίνακα μετά:
empNum | επίθετο | όνομα | ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ | deptNum | Μισθός |
---|---|---|---|---|---|
ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ | ΜΗΔΕΝΙΚΟ |
MySQL DELETE Ολόκληρος ο πίνακας
Τώρα, θα εξετάσουμε το σενάριο όπου πρέπει να διαγράψουμε τον ίδιο τον πίνακα. Σε όρους SQL, το ονομάζουμε DROP the table. Δεν έχει σημασία αν ο πίνακας έχει δεδομένα ή όχι. Απλώς θα ρίξει τον πίνακα μαζί με τα δεδομένα εάν υπάρχουν.
Στην παραπάνω ενότητα, διαγράψαμε τα δεδομένα από τον πίνακα των υπαλλήλων. Σε αυτήν την ενότητα, θα αποθέσουμε τον ίδιο τον πίνακα υπαλλήλων.
Ακολουθεί η εντολή μαζί με την έξοδο:
Όπως απεικονίζεται στην παραπάνω εικόνα, η δήλωση DROP εκτελέστηκε με επιτυχία και διέγραψε τον πίνακα ملازمین_ ιστορικό από τον κατάλογο συστήματος της βάσης δεδομένων MySQL.
Εάν ρίξετε μια ματιά στο μήνυμα, θα εμφανιστεί '0 σειρές (ες) που επηρεάζονται'. Αυτό συμβαίνει επειδή είχαμε διαγράψει και τις 18 σειρές στην προηγούμενη ενότητα. Εάν αυτός ο πίνακας είχε σειρές, τότε θα επηρεάζονταν αυτοί οι αριθμοί σειρών, κάτι που σημαίνει διαγραμμένο.
Για να επαληθεύσουμε την έξοδο αυτής της δήλωσης DROP, ας εκτελέσουμε SELECT στον πίνακα και να δούμε τι έχουμε στην έξοδο.
Το μήνυμα εξόδου του παραπάνω ερωτήματος επαλήθευσης λέει ότι ο πίνακας δεν υπάρχει. Αυτό επικυρώνει την εκτέλεση της παραπάνω δήλωσης DROP για να ρίξει τον πίνακα.
Ερώτηση:
DROP TABLE employees_history ;
Εντολή MySQL Truncate
Έχουμε ήδη συζητήσει τη διαγραφή όλων των εγγραφών από τον πίνακα χρησιμοποιώντας την εντολή DELETE. Το ίδιο θα μπορούσε να επιτευχθεί και με τη δήλωση TRUNCATE.
Για αυτό το παράδειγμα, ας ξαναδημιουργήσουμε τον πίνακα υπαλλήλων_ ιστορίας και να τον συμπληρώσουμε ξανά με δεδομένα. Τ Ακολουθεί τα δύο ερωτήματα που έχουν εκτελεστεί για να δημιουργήσετε ξανά τον πίνακα και να το συμπληρώσετε ξανά:
Ερώτηση:
CREATE TABLE employees_history LIKE employees ; INSERT INTO employees_history (SELECT * FROM employees) ;
Έτσι φαίνεται ο πίνακας υπαλλήλων_στοιχείων με δεδομένα.
Στη συνέχεια, θα καταργήσουμε όλες τις εγγραφές από αυτόν τον πίνακα χρησιμοποιώντας τη δήλωση TRUNCATE.
Όπως φαίνεται στην εικόνα, το ερώτημα εκτελείται με επιτυχία. Εάν ρίξετε μια προσεκτική ματιά στο τμήμα 'Μήνυμα', θα διαπιστώσετε ότι λέει 'επηρεάζονται 0 σειρές'. Ωστόσο, γνωρίζουμε ότι αυτός ο πίνακας έχει 15 σειρές. Τότε πώς έρχεται η εκπομπή είναι μηδέν;
Λόγος: Η περικοπή της δήλωσης δεν ενδιαφέρεται να μετρήσει πόσες σειρές επηρεάζονται από την εκτέλεσή της. Αδειάζει απλώς τον πίνακα. Αυτή είναι μια από τις σημαντικές διαφορές μεταξύ των δηλώσεων DELETE και TRUNCATE.
Ας επαληθεύσουμε την εκτέλεση της δήλωσης TRUNCATE εκτελώντας ένα ερώτημα SELECT στον πίνακα των υπαλλήλων_ ιστορίας.
Όπως φαίνεται στην παραπάνω εικόνα, το ερώτημα δεν επέστρεψε σειρές και επίσης όλες οι στήλες εμφανίζουν τιμές NULL, υπονοώντας ότι η δήλωση TRUNCATE που εκτελέσαμε νωρίτερα έχει διαγράψει όλες τις εγγραφές από τον πίνακα.
Ερώτηση:
TRUNCATE TABLE employees_history ;
Διαφορά μεταξύ των δηλώσεων TRUNCATE και DELETE
Κ. Όχι | ΔΙΑΓΡΑΦΩ | ΚΟΛΟΒΟΣ |
---|---|---|
1 | Είναι DML (Γλώσσα χειρισμού δεδομένων). | Είναι DDL (Γλώσσα ορισμού δεδομένων). |
δύο | Οποιαδήποτε σκανδάλη ΜΕΤΑ ΤΗΝ ΔΙΑΓΡΑΦΗ στον πίνακα ενεργοποιείται όταν χρησιμοποιούμε την εντολή ΔΙΑΓΡΑΦΗ. | Καμία ενεργοποίηση ΜΕΤΑ ΤΗ ΔΙΑΓΡΑΦΗ στον πίνακα δεν ενεργοποιείται όταν χρησιμοποιούμε την εντολή TRUNCATE. |
3 | Μια εγγραφή μπορεί να διαγραφεί ακόμα και αν υπάρχουν περιορισμοί ξένου κλειδιού. | Οι εγγραφές από τον πίνακα δεν μπορούν να περικοπούν εάν υπάρχουν περιορισμοί ξένου κλειδιού. |
4 | Δεν θα πραγματοποιηθεί εκ νέου προετοιμασία του πίνακα. | Ο πίνακας θα επαναπροσδιοριστεί. |
5 | ΠΟΥ μπορεί να χρησιμοποιηθεί η ρήτρα. | ΠΟΥ δεν μπορεί να χρησιμοποιηθεί η ρήτρα. |
6 | Αυτό διαγράφει μία εγγραφή κάθε φορά και κρατά ένα κομμάτι του συνολικού αριθμού των διαγραμμένων εγγραφών στα αρχεία καταγραφής. | Εκκαθαρίζει όλες τις εγγραφές ταυτόχρονα και δεν παρακολουθεί τον αριθμό των εγγραφών που έχουν διαγραφεί. |
Αναφερόμενη ακεραιότητα και ο αντίκτυπός της στο DELETE
Πριν είμαστε, ας δούμε Τι είναι η ακεραιότητα αναφοράς ή οι περιορισμοί RI ή Foreign Key;
Οι περιορισμοί ξένου κλειδιού αφορούν στη δημιουργία σχέσης ή σύνδεσης μεταξύ του γονέα και του παιδικού πίνακα. Αυτό βοηθά στην παραπομπή των δεδομένων στους πίνακες που συνδέονται μεταξύ τους. Ένας γονικός πίνακας μπορεί να έχει πολλούς θυγατρικούς πίνακες και αντίστροφα.
Για παράδειγμα, οι δύο πίνακες που έχουμε συζητήσει μέχρι τώρα, δηλαδή οι υπάλληλοι και τα τμήματα, συνδέονται μεταξύ τους χρησιμοποιώντας έναν περιορισμό ξένου κλειδιού. Αυτός ο περιορισμός δημιουργείται κάνοντας μία στήλη, συνήθως το πρωτεύον κλειδί, ως τη στήλη κλειδιού που συνδέει δύο πίνακες.
Η στήλη deptNum στον πίνακα του τμήματος έχει συνδεθεί με τη στήλη deptNum στον πίνακα του υπαλλήλου. Σε αυτήν την περίπτωση, τα τμήματα είναι ο πίνακας γονέα και οι υπάλληλοι είναι ο πίνακας παιδιών.
Αλλά, πώς αυτό επηρεάζει τις δηλώσεις ΔΙΑΓΡΑΦΗ;
Στη MySQL ή σε οποιαδήποτε βάση δεδομένων, υπάρχουν ορισμένα σενάρια που πρέπει να αντιμετωπιστούν κατά τη διαγραφή εγγραφών από τους πίνακες γονέων ή θυγατρικών.
Υπάρχουν πολλές επιλογές αναφοράς που μπορούμε να συζητήσουμε:
# 1) ΣΤΗ ΔΙΑΓΡΑΦΗ ΚΑΖΑΣ: Ο κανόνας λέει ότι δεν μπορούμε να αφαιρέσουμε μια σειρά από τον γονικό πίνακα εάν έχει αναφορές ή έχει αντίστοιχη σειρά σε οποιονδήποτε από τους θυγατρικούς πίνακες. Ωστόσο, εάν ένας γονικός πίνακας έχει αρκετά θυγατρικά τραπέζια, τότε είναι κουραστικό έργο να αφαιρέσετε πρώτα τις εγγραφές από κάθε πίνακα θυγατρικών και μετά από τον πίνακα γονέα.
Για αυτό, υπάρχει μια λύση που ονομάζεται ON DELETE CASCADE. Αυτή είναι μια ρήτρα που προστίθεται στη δήλωση ΔΗΜΙΟΥΡΓΙΑ καθενός από τους θυγατρικούς πίνακες. Έτσι, όποτε λέμε διαγραφή μιας σειράς από τον γονικό πίνακα, τότε ο κινητήρας MySQL θα προσδιορίζει πρώτα τις αναφορές αυτής της σειράς στους θυγατρικούς πίνακες και θα αφαιρέσει αυτές τις εγγραφές και επιτέλους θα διαγράψει την εγγραφή από τον γονικό πίνακα.
# 2) ΟΧΙ ΔΡΑΣΗ: Αυτή είναι μια προεπιλεγμένη επιλογή. Εάν η εκτέλεση μιας δήλωσης DELETE επιχειρεί να διαγράψει μια εγγραφή που έχει αναφορές σε οποιονδήποτε από τους θυγατρικούς πίνακες, τότε με αυτήν την επιλογή η εκτέλεση της δήλωσης θα σταματήσει και το Συναλλαγή MySQL θα επιστρέψει στο τελευταίο σημείο δέσμευσης.
# 3) ΠΕΡΙΟΡΙΣΜΟΣ: Η λειτουργία του ΠΕΡΙΟΡΙΣΜΟΥ και ΟΧΙ ΔΡΑΣΗ είναι η ίδια. Θα σταματήσει την εκτέλεση και θα εκδώσει μια επαναφορά.
# 4) ΣΕΤ NULL: Εάν η εκτέλεση μιας δήλωσης διαγραφής επιχειρεί να διαγράψει μια εγγραφή που έχει αναφορές σε οποιονδήποτε θυγατρικό πίνακα, τότε αυτή η επιλογή θα ενημερώσει την τιμή της στήλης σε όλους τους θυγατρικούς πίνακες ως NULL και μόλις ολοκληρωθεί, θα διαγράψει την εγγραφή από τον γονέα τραπέζι.
# 5) ΟΡΙΣΜΕΝΟΣ ΟΡΙΣΜΟΣ: Εάν η εκτέλεση μιας δήλωσης DELETE επιχειρεί να διαγράψει μια εγγραφή που έχει αναφορές σε οποιονδήποτε από τους θυγατρικούς πίνακες, τότε αυτή η επιλογή θα ενημερώσει τις τιμές της στήλης στην προεπιλεγμένη τιμή, όπως ορίζεται στη δήλωση ΔΗΜΙΟΥΡΓΙΑ του πίνακα.
Συχνές Ερωτήσεις και Απαντήσεις
Ε # 1) Πώς να διαγράψετε δεδομένα από τον πίνακα στη MySQL;
Απάντηση: Παρακάτω δίνεται η σύνταξη της εντολής διαγραφής για διαγραφή μόνο μιας επιλεγμένης σειράς δεδομένων.
DELETE FROM table_name WHERE condition;
Ε # 2) Πώς να διαγράψετε όλα τα δεδομένα από τον πίνακα στη MySQL;
Απάντηση: Η σύνταξη της εντολής DELETE για διαγραφή όλων των σειρών από τον πίνακα είναι:
DELETE * FROM table_name;
Q # 3) Πώς να διαγράψετε τον πίνακα από τη βάση δεδομένων στο MySQL;
Απάντηση: Η εντολή drop μπορεί να χρησιμοποιηθεί για τη διαγραφή του πίνακα από τη βάση δεδομένων. Ο χρήστης μπορεί να αντικαταστήσει το table_name με τον πίνακα που πρέπει να διαγραφεί.
DROP TABLE table_name;
Q # 4) Πώς να διαγράψετε τη βάση δεδομένων στο MySQL;
Απάντηση: Η εντολή drop μπορεί να χρησιμοποιηθεί για τη διαγραφή της βάσης δεδομένων.
DROP Database db_name;
Οι χρήστες μπορούν να αντικαταστήσουν το όνομα db_name με το όνομα της βάσης δεδομένων που πρέπει να διαγραφεί.
Q # 5) Τι είναι το ON DELETE CASCADE στο MySQL;
Απάντηση: Όταν η γονική εγγραφή διαγραφεί, το ON DELETE CASCADE δημιουργεί μια αντίστοιχη θυγατρική εγγραφή που θα διαγραφεί. Έτσι, η επίδραση της διαγραφής περνά από τον γονέα στο παιδί. Αυτό μπορεί να είναι χρήσιμο στην εκτέλεση διαγραφής πολλών πινάκων.
Q # 6) Γιατί το TRUNCATE θεωρείται δήλωση DDL;
Απάντηση: Η δήλωση TRUNCATE πραγματικά πέφτει και δημιουργεί ξανά τον πίνακα μαζί με τα μεταδεδομένα του πίνακα. Έτσι, είναι μια δήλωση DDL.
πώς μπορώ να ανοίξω ένα χείμαρρο
Ε # 7) Μπορεί το TRUNCATE να γυρίσει πίσω;
Απάντηση: Όχι, το TRUNCATE είναι μια δήλωση αυτόματης δέσμευσης εάν εκτελείται αυτόνομη. Αυτό σημαίνει ότι δεν μπορεί να επιστραφεί καθώς η δέσμευση εκτελείται επίσης μαζί της. Αν όμως είναι μέρος μιας συναλλαγής, τότε μπορεί να επαναφερθεί χρησιμοποιώντας τα αρχεία καταγραφής SQL.
Ε # 8) Μπορούν οι ΔΙΑΓΡΑΦΕΣ να επαναφέρουν τις δηλώσεις;
Απάντηση: Ναι, μπορείτε να επαναφέρετε τις δηλώσεις DELETE. Απλώς εκτελέστε την εντολή ROLLBACK πριν εκτελέσετε το COMMIT.
Ε # 9) Μπορεί να διαγραφεί μια στήλη χρησιμοποιώντας την εντολή ΔΙΑΓΡΑΦΗ;
Απάντηση: Η προσθήκη στήλης ή η διαγραφή είναι εντολές DDL. Μια δήλωση ALTER θα πρέπει να χρησιμοποιηθεί για να ΣΤΑΣΕΙΣ μια στήλη από τον πίνακα.
συμπέρασμα
Σε αυτό το σεμινάριο, μάθαμε διαφορετικούς τρόπους εκτέλεσης DELETE δηλώσεων στη MySQL.
Με λίγα λόγια, είδαμε:
- MySQL Delete Single Row
- MySQL Διαγραφή χρησιμοποιώντας ORDER BY και Limit Clause
- Διαγραφή MySQL με χρήση του Select Clause
- MySQL Delete Ολόκληρος ο πίνακας
- MySQL Truncate
- Διαφορά μεταξύ των δηλώσεων TRUNCATE και DELETE
- Αναφερόμενη ακεραιότητα και οι επιπτώσεις της στο DELETE
Μπορούμε να χρησιμοποιήσουμε ένα από τα παραπάνω, με βάση την απαίτηση.
Καλή ανάγνωση !!
Συνιστώμενη ανάγνωση
- Unix Cat Command Syntax, Επιλογές με παραδείγματα
- Unix Sort Command με Σύνταξη, Επιλογές και Παραδείγματα
- Εισαγωγή MySQL σε πίνακα - Εισαγωγή σύνταξης δήλωσης & παραδειγμάτων
- MongoDB Ενημέρωση και Διαγραφή εγγράφου με παραδείγματα
- Αποκοπή εντολής στο Unix με παραδείγματα
- Νέοι / Διαγραφή τελεστών στο C ++ με παραδείγματα
- Tutorial MySQL Update Statement - Ενημέρωση σύνταξης ερωτημάτων και παραδείγματα
- Ls Command στο Unix με παραδείγματα