Εάν δεν καταφέρατε να εισαγάγετε μια νέα εγγραφή σε έναν πίνακα λόγω του μοναδικού περιορισμού, μην παραλείψετε να διαβάσετε αυτό το άρθρο. Θα σας βοηθήσει να λύσετε αυτό το πρόβλημα.
Σε αυτό το άρθρο, θα εισαγάγουμε 4 μεθόδους για την επίλυση του προβλήματος όταν αποτυγχάνετε να εισαγάγετε μια νέα εγγραφή επειδή παραβιάζει τον μοναδικό περιορισμό του πίνακα στο SQL Server.
Μια πραγματική υπόθεση:
Ας δούμε τώρα μια πραγματική υπόθεση. Έχουμε μια βάση δεδομένων που ονομάζεται "Προϊόν" και υπάρχει ένας πίνακας που ονομάζεται "DataNumenΠροϊόν» στη βάση δεδομένων. Υπάρχουν δύο πεδία στον πίνακα, π.χ. "ProductId" και "ProductName", με τύπους δεδομένων "int" και "varchar" αντίστοιχα. Και το "ProductId" είναι ένα πρωτεύον κλειδί με μοναδικό περιορισμό.
Αυτήν τη στιγμή υπάρχουν ορισμένες εγγραφές στον πίνακα, όπως παρακάτω:
Εικόνα 1 Εγγραφές στον Πίνακα "DataNumenΠροϊόν"
Υποθέτοντας ότι υπάρχουν δύο DBA για τη βάση δεδομένων, δηλαδή, ο Jim και ο Tom. Μια μέρα, ο Jim διέγραψε την πρώτη εγγραφή στον πίνακα, όπως παρακάτω:
DELETE FROM DataNumenProduct WHERE ProductId=1;
Τη δεύτερη μέρα, ο Τομ εισήγαγε μια νέα εγγραφή στον πίνακα, η οποία έχει το ίδιο πρωτεύον κλειδί με τη διαγραμμένη εγγραφή, όπως παρακάτω:
INSERT INTO DataNumenProduct VALUES(1,'DataNumen OutLook Repair');
Ο πίνακάς μας λοιπόν έχει τις ακόλουθες εγγραφές, όπως παρακάτω:
Εικόνα 2 Ενημερωμένα αρχεία στον πίνακα "DataNumenΠροϊόντα"
Τώρα, εάν ο Jim θέλει να επαναφέρει τη διαγραμμένη εγγραφή πίσω στον πίνακα, θα παραβιάσει τον μοναδικό περιορισμό του πρωτεύοντος κλειδιού "ProductId". Σε μια τέτοια περίπτωση, μπορούμε να χρησιμοποιήσουμε έναν από τους παρακάτω τρόπους λύσης για να λύσουμε το πρόβλημα.
Εναλλακτικός τρόπος αντιμετώπισης 1: Τροποποιήστε το πρωτεύον κλειδί της νέας εγγραφής για να αποτρέψετε τη σύγκρουση
Μπορούμε να τροποποιήσουμε το πρωτεύον κλειδί της εγγραφής που θα εισαχθεί σε μια νέα τιμή που είναι διαφορετική από αυτές όλων των υπαρχουσών εγγραφών στον πίνακα. Πάρτε για παράδειγμα την παραπάνω περίπτωση, για την εισαγωγή της εγγραφής, μπορούμε να τροποποιήσουμε την τιμή του πρωτεύοντος κλειδιού από 1 σε 5. Στη συνέχεια, μπορούμε να επαναφέρουμε τη νέα εγγραφή που δημιουργήθηκε ξανά στον πίνακα, όπως παρακάτω:
INSERT INTO DataNumenProduct VALUES(5, 'DataNumen Access Repair');
Ακολουθούν τα τελικά ρεκόρ στον πίνακα:
Σχήμα 3 Τελικά αρχεία στον Πίνακα "DataNumen Προϊόντα"
Λύση 2: Τροποποίηση του πρωτεύοντος κλειδιού της υπάρχουσας εγγραφής για την αποφυγή σύγκρουσης
- Αρχικά, πρέπει να ενημερώσουμε την τιμή του πρωτεύοντος κλειδιού της υπάρχουσας εγγραφής που μπορεί να προκαλέσει διένεξη, όπως παρακάτω:
UPDATE DataNumenProduct SET ProductId = 6 WHERE ProductId = 1;
Ακολουθούν οι ενημερωμένες εγγραφές στον πίνακα:
Εικόνα 4 Ενημερωμένα αρχεία στον πίνακα "DataNumen Προϊόντα"
- Στη συνέχεια, μπορούμε να επαναφέρουμε τη διαγραμμένη εγγραφή στον πίνακα, όπως παρακάτω:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair ');
Ας δούμε τώρα την τελική έκδοση, όπως παρακάτω:
Εικόνα 5 Τελικά αρχεία στον Πίνακα "DataNumen Προϊόντα"
Λύση 3: Απενεργοποιήστε προσωρινά τον μοναδικό περιορισμό μέσω SQL
- Για να λύσουμε το πρόβλημα, μπορούμε να διαγράψουμε προσωρινά τον περιορισμό πρωτεύοντος κλειδιού "pk" στον πίνακα, όπως παρακάτω:
ALTER TABLE DataNumenProduct DROP CONSTRAINT pk;
- Στη συνέχεια, μπορούμε να προσθέσουμε ξανά τη διαγραμμένη εγγραφή στον πίνακα, όπως παρακάτω:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Ας δούμε τώρα τις εγγραφές στον πίνακα:
Εικόνα 6 Ενημερωμένα αρχεία στον πίνακα "DataNumen Προϊόντα"
- Στη συνέχεια, επειδή δύο εγγραφές έχουν τις ίδιες τιμές πρωτεύοντος κλειδιού, πρέπει να τροποποιήσουμε μία από αυτές για να αποτρέψουμε τη σύγκρουση, όπως παρακάτω:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Επιτέλους, προσθέτουμε ξανά τον περιορισμό πρωτεύοντος κλειδιού "pk" στον πίνακα, όπως παρακάτω:
ALTER TABLE DataNumenProduct ADD CONSTRAINT pk PRIMARY KEY(ProductId);
Τώρα υπάρχουν κάποιες εγγραφές στον πίνακα, όπως παρακάτω:
Εικόνα 7 Ενημερωμένο περιεχόμενο στον πίνακα "DataNumen Προϊόντα"
Λύση 4: Απενεργοποιήστε προσωρινά τον μοναδικό περιορισμό μέσω SQL Server Management Studio:
- Αρχικά, διαγράφουμε τον περιορισμό πρωτεύοντος κλειδιού "pk" στον πίνακα μέσω GUI, όπως παρακάτω:
Εικόνα 8 Διαγράψτε τον περιορισμό πρωτεύοντος κλειδιού "pk" μέσω GUI
- Στη συνέχεια εισάγουμε τη διαγραμμένη εγγραφή σε πραγματική περίπτωση στον πίνακα, όπως παρακάτω.
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Τώρα υπάρχουν κάποιες εγγραφές στον πίνακα, όπως παρακάτω:
Εικόνα 9 Ενημερωμένο περιεχόμενο στον πίνακα "DataNumen Προϊόντα"
- Στη συνέχεια, τροποποιούμε την τιμή του πρωτεύοντος κλειδιού της υπάρχουσας εγγραφής στον πίνακα, όπως παρακάτω:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Επιτέλους, προσθέτουμε ξανά τον περιορισμό πρωτεύοντος κλειδιού "pk" στον πίνακα μέσω GUI, όπως παρακάτω:
Εικόνα 8 Προσθήκη πίσω του περιορισμού πρωτεύοντος κλειδιού "pk" μέσω GUI
Λύστε SQL Server Διαφθορά βάσης δεδομένων
Εκτός από τους μοναδικούς περιορισμούς, SQL Server διαφθορά είναι επίσης ένα πολύ κοινό πρόβλημα που ενοχλεί τα DBA. Κανονικά μπορούμε να χρησιμοποιήσουμε SQL Server ενσωματωμένες εντολές για την επίλυση των βλαβών. Ωστόσο, εάν δεν λειτουργούν, τότε μπορούμε να καταφύγουμε σε κάποιο τρίτο μέρος SQL Server εργαλεία ανάκτησης δεδομένων.
Εισαγωγή συγγραφέα:
Ο Jim Hu είναι ειδικός στην ανάκτηση δεδομένων DataNumen, Inc., η οποία είναι ο παγκόσμιος ηγέτης στις τεχνολογίες ανάκτησης δεδομένων, συμπεριλαμβανομένων Επισκευή πρόσβασης και dbf επισκευή προϊόντων λογισμικού. Για περισσότερες πληροφορίες επισκεφθείτε www.datanumen.com








