Πώς να καταργήσετε διπλές γραμμές από έναν πίνακα του SQL Server

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:139444
Περίληψη
Πίνακες Microsoft SQL Server πρέπει να περιέχουν ποτέ διπλότυπες γραμμές ούτεμη μοναδικές πρωτεύοντα κλειδιά. Για συντομία, θα μερικές φορές αναφερόμαστε σε πρωτεύονπλήκτρα ως "κλειδί" ή "PK" σε αυτό το άρθρο, αλλά αυτό θα πάντα υποδηλώνουν "πρωτεύονκλειδί". Διπλές PKs είναι παραβίαση ακεραιότητα οντότητας και θα πρέπει ναδεν επιτρέπονται σχεσιακή συστήματος. SQL Server έχει διάφορους μηχανισμούς γιαΕπιβολή ακεραιότητας οντότητα, συμπεριλαμβανομένων ευρετηρίων, ΜΟΝΑΔΙΚΟΎΣ περιορισμούςΠεριορισμούς ΠΡΩΤΕΎΟΝΤΟΣ ΚΛΕΙΔΙΟΎ και εναύσματα.

Παρά αυτό, σε ασυνήθεις περιστάσεις διπλότυπες πρωτεύοντα κλειδιά ενδέχεται να προκύψει,και εάν συμβαίνει αυτό, πρέπει να εξαλειφθούν. Ένας τρόπος να συμβούν είναι εάν διπλότυπωνPKs υπάρχει σε μη σχεσιακών δεδομένων εκτός του SQL Server και τα δεδομένα είναιΕισαγωγή ενώ μοναδικότητας PK που επιβάλλεται δεν. Ένας άλλος τρόπος να μπορούνπροκύψει είναι μέσω σφάλμα σχεδίασης βάσης δεδομένων, όπως η επιβολή δεν οντότηταςακεραιότητα σε κάθε πίνακα.

Συχνά οι παρατηρήσει διπλότυπες PKs όταν προσπαθείτε να δημιουργήσετε ένα μοναδικό ευρετήριοπου θα ματαιώσει Εάν βρεθούν διπλότυπα κλειδιά. Αυτό το μήνυμα είναι:
Msg 1505, επίπεδο 16, κράτος 1Δημιουργία μοναδικού ευρετηρίου ματαιωθεί στο διπλό κλειδί.
Αν χρησιμοποιείτε το SQL Server 2000 ή SQL Server 2005, ενδέχεται να λάβετε το ακόλουθο μήνυμα λάθους:
Msg 1505, 16 επίπεδο κράτος 1 ΔΗΜΙΟΥΡΓΊΑ ΜΟΝΑΔΙΚΟΎ ΕΥΡΕΤΗΡΊΟΥ τερματίστηκε, επειδή βρέθηκε ένα διπλό κλειδί για το όνομα αντικειμένου ' %. * ls' και όνομα ευρετηρίου ' %. * ls'. Διπλότυπη τιμή κλειδιού είναι % ls.
Αυτό το άρθρο ασχολείται με τον τρόπο για να εντοπίσετε και να καταργήσετε διπλές πρωτεύοντα κλειδιά απόπίνακας. Ωστόσο, στενά πρέπει να εξετάσετε τη διαδικασία που επιτρέπεται ηδιπλότυπα να συμβεί προκειμένου να αποφευχθεί επανάληψη παρόμοιων συμβάντων.

Περισσότερες πληροφορίες
Αυτό το παράδειγμα, θα χρησιμοποιήσουμε τον ακόλουθο πίνακα με διπλότυπες τιμές PK της.Σε αυτόν τον πίνακα πρωτεύοντος κλειδιού είναι δύο στήλες (Στ1, Στηλ2). Εμείς δενδημιουργήσετε ένα μοναδικό ευρετήριο ή περιορισμό ΠΡΩΤΕΎΟΝΤΟΣ ΚΛΕΙΔΙΟΎ, εφόσον έχουν δύο γραμμέςδιπλή PKs. Αυτή η διαδικασία παρουσιάζει τον τρόπο για να εντοπίσετε και καταργήσετε τοδιπλότυπα.
create table t1(col1 int, col2 int, col3 char(50))insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 2, 'data value two')				
Το πρώτο βήμα είναι να προσδιορίσετε ποιες γραμμές έχετε διπλότυπες τιμές πρωτεύοντος κλειδιού:
SELECT col1, col2, count(*)FROM t1GROUP BY col1, col2HAVING count(*) > 1				
Αυτό θα επιστρέψει μία γραμμή για κάθε σύνολο διπλότυπες τιμές PK στον πίνακα.Στην τελευταία στήλη αυτό το αποτέλεσμα είναι ο αριθμός των διπλοτύπων για τοσυγκεκριμένη τιμή PK.

Στ1Στηλ2
112


Εάν υπάρχουν διπλότυπες τιμές PK μόνο μερικά σύνολα, η καλύτερη διαδικασία είναιΓια να διαγράψετε αυτά τα με μη αυτόματο τρόπο σε ατομική βάση. Για παράδειγμα:
set rowcount 1delete from t1where col1=1 and col2=1				
Τιμή rowcount πρέπει να είναι ο αριθμός των διπλοτύπων για μια δεδομένη τιμή κλειδιού n-1. Σε αυτό το παράδειγμα, υπάρχουν διπλότυπα 2 έτσι rowcount έχει οριστεί σε 1. Οι τιμές Στ1/Στηλ2 λαμβάνονται από την ανωτέρω ΟΜΆΔΑ με αποτέλεσμα ερωτήματος. Εάν ΟΜΆΔΑΣ από το ερώτημα επιστρέφει πολλαπλές γραμμές, το ερώτημα "Ορισμός rowcount" θα πρέπει να εκτελείται μία φορά για κάθε μία από αυτές τις γραμμές. Κάθε φορά που εκτελείται, ορίστε rowcount αριθμό διπλότυπων συγκεκριμένη τιμή PK n-1.

Πριν να διαγράψετε τις γραμμές, πρέπει να βεβαιωθείτε ότι είναι ολόκληρη η γραμμήδιπλότυπο. Ενώ είναι απίθανο, είναι πιθανό ότι οι τιμές PK είναι διπλότυπες,ακόμα δεν γραμμή σύνολο. Ένα παράδειγμα είναι ένας πίνακας μεΑριθμός κοινωνικής ασφάλισης ως πρωτεύον κλειδί και έχουν δύο διαφορετικά άτομα(ή γραμμές) με τον ίδιο αριθμό κάθε έχουν μοναδικά χαρακτηριστικά. Κατάοποιαδήποτε δυσλειτουργία που προκαλείται διπλό κλειδί μπορεί να προκάλεσε επίσης την περίπτωσηέγκυρο μοναδικό δεδομένα θα τοποθετηθούν στη γραμμή. Αυτά τα δεδομένα θα πρέπει να αντιγράφεται καιδιατηρούνται για συμφωνία μελέτης και είναι δυνατόν πριν από την διαγραφή των δεδομένων.

Εάν υπάρχουν πολλές διαφορετικές ομάδες διπλότυπες τιμές PK στον πίνακα, ενδέχεται ναείναι πολύ χρονοβόρο να καταργήσετε μεμονωμένα. Στην περίπτωση αυτή τοδιαδικασία μπορεί να χρησιμοποιηθεί:
  1. Πρώτα, εκτελέστε παραπάνω ΟΜΆΔΑ από ερώτημα για να προσδιορίσετε πόσα σύνολα διπλότυπες τιμές PK υπάρχει και το πλήθος των διπλοτύπων για κάθε σύνολο.
  2. Επιλέξτε τις διπλότυπες τιμές κλειδιού σε έναν πίνακα της εκμετάλλευσης. Για παράδειγμα:
    SELECT col1, col2, col3=count(*)INTO holdkeyFROM t1GROUP BY col1, col2HAVING count(*) > 1					
  3. Επιλέξτε τις διπλές σειρές σε έναν πίνακα εκμετάλλευση, εξάλειψη διπλότυπων στη διαδικασία. Για παράδειγμα:
    SELECT DISTINCT t1.*INTO holddupsFROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  4. Στο σημείο αυτό, ο πίνακας holddups πρέπει να έχουν μοναδικό PKs, ωστόσο, αυτό δεν θα συμβαίνει εάν είχε t1 διπλότυπες PKs ακόμη μοναδικές γραμμές (όπως στο παραπάνω παράδειγμα αριθμού κοινωνικής Ασφάλισης). Βεβαιωθείτε ότι κάθε κλειδί holddups είναι μοναδικό και ότι δεν έχετε διπλότυπα κλειδιά ακόμα μοναδικές γραμμές. Εάν έτσι, πρέπει να σταματήσετε εδώ και να εναρμονίσετε ποια από τις γραμμές που θέλετε να κρατήσετε για μια δεδομένη διπλότυπη τιμή κλειδιού. Για παράδειγμα, το ερώτημα:
    SELECT col1, col2, count(*)FROM holddupsGROUP BY col1, col2						
    θα πρέπει να επιστρέψει το πλήθος 1 για κάθε γραμμή. Εάν Ναι, προχωρήστε στο βήμα 5 παρακάτω. Εάν όχι, έχετε διπλότυπα κλειδιά ακόμα μοναδικές γραμμές και πρέπει να αποφασίσετε ποιες γραμμές να αποθηκεύσετε. Συνήθως, αυτό θα συνεπάγεται είτε απορρίπτοντας μια γραμμή ή δημιουργώντας μια νέα μοναδική τιμή κλειδιού για αυτήν τη γραμμή. Λαμβάνει ένα από αυτά τα δύο βήματα για κάθε τέτοια PK διπλότυπες στον πίνακα holddups.
  5. Διαγραφή διπλές σειρές από τον αρχικό πίνακα. Για παράδειγμα:
    DELETE t1FROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  6. Τοποθέτηση μοναδικές γραμμές πίσω στον αρχικό πίνακα. Για παράδειγμα:
    INSERT t1 SELECT * FROM holddups					
sql6 dedupe intg οντότητα

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί αυτόματα

Ιδιότητες

Αναγνωριστικό άρθρου: 139444 - Τελευταία αναθεώρηση: 09/17/2011 18:46:00 - Αναθεώρηση: 5.0

Microsoft SQL Server 6.0 Standard Edition, Microsoft SQL Server 6.5 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbsqlsetup kbinfo kbusage kbmt KB139444 KbMtel
Σχόλια