Δευτερεύον κλειδί βάσης δεδομένων. Η έννοια του κλειδιού σε μια βάση δεδομένων, πρωτεύοντα και ξένα κλειδιά. Διαδοχική αναφορική ακεραιότητα

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

Τι είναι το πρωτεύον κλειδί σε μια βάση δεδομένων

Σε μια βάση δεδομένων, το πρωτεύον κλειδί ενός πίνακα είναι μια από τις στήλες του (Πρωτεύον κλειδί). Ας δούμε ένα παράδειγμα για το πώς φαίνεται αυτό. Ας φανταστούμε μια απλή στάση πανεπιστημιακών (ας την πούμε «Φοιτητές»).

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

Απλό και σύνθετο πρωτεύον κλειδί

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

Ονοματεπώνυμο Ημερομηνία γεννήσεως Σειρά διαβατηρίων Αριθμός διαβατηρίου
Ivanov P.A. 12.05.1996 75 0553009
Sergeev V.T. 14.07.1958 71 4100654
Krasnov L.V. 22.01.2001 73 1265165

Τα διαβατήρια των ατόμων μπορεί να περιέχουν την ίδια σειρά ή αριθμούς, αλλά δεν υπάρχουν διαβατήρια με τον ίδιο συνδυασμό σειρών και αριθμών. Έτσι, τα πεδία «Σειρά διαβατηρίου» και «Αριθμός διαβατηρίου» θα γίνουν ένα σύνθετο κλειδί της καθορισμένης σχέσης, προσδιορίζοντας μοναδικά το άτομο.

Συνδέσεις μεταξύ των σχέσεων

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

Ας επιστρέψουμε στο πρώτο παράδειγμα με τη σχέση «Μαθητές». Εκτός από αυτή τη σχέση, η βάση δεδομένων αποθηκεύει και άλλες πληροφορίες, για παράδειγμα, την απόδοση κάθε μαθητή. Για να μην επαναληφθούν όλες οι πληροφορίες που ήδη περιέχονται στη βάση δεδομένων, χρησιμοποιούν ένα κλειδί, που αναφέρεται στην επιθυμητή εγγραφή. Μοιάζει με αυτό.

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

Φυσικό και υποκατάστατο κλειδί

Πώς καθορίζεται το πρωτεύον κλειδί ενός πίνακα βάσης δεδομένων; Τα δύο παραδείγματα που εξετάσαμε - "Students" και "Bank Clients" - απεικονίζουν τις έννοιες των φυσικών και υποκατάστατων κλειδιών. Στον πίνακα πελατών τραπεζών, ορίσαμε ένα κλειδί που αποτελείται από τα πεδία «Αριθμός» και «Σειρά Διαβατηρίου», χρησιμοποιώντας ήδη υπάρχουσες στήλες. Αυτό το κλειδί ονομάζεται φυσικό, δεν κάναμε αλλαγές ή προσθήκες για να το προσδιορίσουμε. Στην περίπτωση της σχέσης «Φοιτητές», κανένα μεμονωμένο πεδίο ή συνδυασμός πεδίων δεν μας έδωσε μοναδικότητα. Αυτό μας ανάγκασε να εισάγουμε ένα επιπλέον πεδίο κωδικού μαθητή. Αυτό το κλειδί ονομάζεται υποκατάστατο κλειδί, για το οποίο προσθέσαμε μια άλλη στήλη υπηρεσίας στον πίνακα. Αυτή η στήλη δεν περιέχει χρήσιμες πληροφορίες και χρησιμεύει μόνο για την αναγνώριση εγγραφών.

Ξένο κλειδί και ακεραιότητα δεδομένων στη βάση δεδομένων

Όλα τα παραπάνω μας οδηγούν στην ακεραιότητα του ξένου κλειδιού και της βάσης δεδομένων. Το ξένο κλειδί είναι ένα πεδίο που αναφέρεται στο Κύριο κλειδί μιας ξένης σχέσης. Στον πίνακα προόδου, αυτές είναι οι στήλες "Μαθητής" και "Πειθαρχία". Τα στοιχεία τους μας παραπέμπουν σε εξωτερικούς πίνακες. Δηλαδή, το πεδίο "Student" στη σχέση "Performance" είναι ένα Ξένο κλειδί και στη σχέση "Student" είναι το πρωτεύον κλειδί στη βάση δεδομένων.

Μια σημαντική αρχή για την κατασκευή βάσεων δεδομένων είναι η ακεραιότητά τους. Και ένας από τους κανόνες του είναι η αναφορική ακεραιότητα. Αυτό σημαίνει ότι ένα ξένο κλειδί ενός πίνακα δεν μπορεί να αναφέρεται σε ένα ανύπαρκτο Πρωτεύον κλειδί άλλης σχέσης. Δεν μπορείτε να διαγράψετε μια εγγραφή με κωδικό 1000 - Ivanov Ivan από τη σχέση Φοιτητής εάν αναφέρεται από μια εγγραφή από τον πίνακα ακαδημαϊκών επιδόσεων. Σε μια σωστά κατασκευασμένη βάση δεδομένων, όταν προσπαθείτε να διαγράψετε, θα λάβετε ένα σφάλμα ότι αυτό το πεδίο χρησιμοποιείται.

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

Σε αυτό το άρθρο θα προσπαθήσουμε να εξετάσουμε όλα όσα σχετίζονται με τα κλειδιά in SQL:προς τι η δημιουργία και οι περιορισμοί κλειδιών; Γενικά: θα είναι βαρετό 😉

Το σχέδιο για σήμερα είναι:

Στη θεωρία των σχεσιακών βάσεων δεδομένων - κλειδιάΠρόκειται για ορισμένες οντότητες που δημιουργήθηκαν για τη θέσπιση ορισμένων περιορισμών που διατηρούν την ακεραιότητα και τη διαθεσιμότητα των δεδομένων σε πίνακες βάσεων δεδομένων.

Με απλά λόγια, τα κλειδιά είναι μέσα sqlδημιουργούνται για να υποδείξουν πρόσθετες λειτουργίες για μια στήλη. Είτε πρόκειται για μοναδικότητα είτε για το γεγονός ότι η στήλη αναφέρεται σε άλλον πίνακα (ξένο κλειδί).

Πρωτεύον κλειδί

Μια στήλη που πρέπει να είναι μοναδική στη βάση δεδομένων επισημαίνεται με πρωτεύον κλειδί. Πρωτεύον κλειδί ή πρωτεύον κλειδί σημαίνει ότι η τιμή της στήλης του πρωτεύοντος κλειδιού δεν μπορεί να επαναληφθεί στον πίνακα. Έτσι, αυτό το κλειδί σάς επιτρέπει να προσδιορίσετε μοναδικά μια εγγραφή στον πίνακα χωρίς φόβο ότι η τιμή της στήλης θα επαναληφθεί. Απλώς ένα παράδειγμα: ας υποθέσουμε ότι έχετε έναν πίνακα χρηστών. Αυτός ο πίνακας έχει τα ακόλουθα πεδία: πλήρες όνομα, έτος γέννησης, τηλέφωνο. Πώς να αναγνωρίσετε έναν χρήστη; Δεν είναι αξιόπιστες παράμετροι όπως το πλήρες όνομα και ο αριθμός τηλεφώνου. Άλλωστε, μπορούμε να έχουμε αρκετούς χρήστες όχι μόνο με το ίδιο επίθετο, αλλά και με το ίδιο όνομα. Ο αριθμός τηλεφώνου μπορεί να αλλάξει με την πάροδο του χρόνου και ο χρήστης με τον αριθμό τηλεφώνου μπορεί να μην είναι αυτός στη βάση δεδομένων μας.

Αυτός είναι ο λόγος που εφευρέθηκε το πρωτεύον κλειδί. Μόλις εκχωρηθεί ένα μοναδικό αναγνωριστικό και αυτό είναι. ΣΕ mySqlστο παράδειγμα του οποίου εκτελούμε όλα τα παραδείγματα από το πεδίο AUTO_INCREMENTδεν μπορεί να οριστεί εκτός εάν υποδείξετε ότι αυτό είναι πρωτεύον κλειδί.

Δεν νομίζω ότι αξίζει να αναφέρουμε ότι ένα πεδίο που επισημαίνεται ως πρωτεύον κλειδί δεν μπορεί να είναι κενό κατά τη δημιουργία μιας εγγραφής.

Ξένο κλειδί ( ξένο κλειδί)

Υπάρχουν περισσότερα ξένο κλειδί (ξένο κλειδί). Λέγεται και αναφορά. Απαιτείται για τη σύνδεση των πινάκων μεταξύ τους.

Αν κοιτάξετε την παραπάνω εικόνα, το ξένο κλειδί θα είναι το πεδίο προμηθευτή στον πίνακα παπουτσιών. Συνήθως, όταν δημιουργείτε έναν πίνακα, καθορίζετε μια στήλη με μοναδικές ακέραιες τιμές. Πώς το κάναμε όταν δημιουργήσαμε τον πίνακα προμηθευτής

Στήλη προμηθευτής_αναγνωριστικόθα είναι μοναδική για κάθε συμμετοχή. Η τιμή του θα εμφανιστεί στη στήλη προμηθευτήςστον πίνακα παπούτσια.Προτείνω να εξετάσετε αμέσως ένα παράδειγμα για το πώς δημιουργείται ένα ξένο κλειδί.

Δημιουργία ξένου κλειδιού

δημιουργία επιτραπέζιων παπουτσιών(shoes_id int auto_increment πρωτεύον κλειδί, κείμενο τίτλου, μέγεθος int, float τιμής, count int, type varchar(30), προμηθευτής int, ξένο κλειδί (προμηθευτής) αναφορές προμηθευτής (supplier_id));

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

Σύνθετο κλειδί (σύνθετο κλειδί)

Όσο για ένα σύνθετο κλειδί, αυτά είναι πολλά κύρια κλειδιά σε έναν πίνακα. Έτσι, έχοντας δημιουργήσει σύνθετο κλειδί, η μοναδικότητα της εγγραφής θα ελεγχθεί από τα πεδία που συνδυάζονται σε αυτό το κλειδί.

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

Δημιουργία δοκιμής πίνακα (πεδίο_1 int, πεδίο_2 κείμενο, πεδίο_3 biint, πρωτεύον κλειδί (πεδίο_1, πεδίο_3));

Στο παραπάνω παράδειγμα, δύο πεδία συνδυάζονται σε ένα σύνθετο κλειδί και δεν θα υπάρχουν εγγραφές στον πίνακα με αυτά τα ίδια πεδία.

Αυτά είναι όλα για τα κλειδιά SQL.Αυτό το μικρό σεμινάριο είναι μια προετοιμασία για το άρθρο όπου θα εξετάσουμε λεπτομερώς πώς να συνδυάσουμε πίνακες ώστε να σχηματίσουν μια ενιαία βάση δεδομένων.

Ένα ξένο κλειδί είναι ένα κλειδί που χρησιμοποιείται για τη σύνδεση δύο πινάκων. Μερικές φορές ονομάζεται επίσης κλειδί αναφοράς.

Ένα ξένο κλειδί είναι μια στήλη ή ένας συνδυασμός στηλών των οποίων οι τιμές αντιστοιχούν σε ένα πρωτεύον κλειδί σε έναν άλλο πίνακα.

Η σχέση μεταξύ 2 πινάκων αντιστοιχεί σε ένα πρωτεύον κλειδί σε έναν από τους πίνακες με ένα ξένο κλειδί στον δεύτερο πίνακα.

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

Παράδειγμα

Ας δούμε τη δομή των δύο παρακάτω πινάκων.

τραπέζι ΠΕΛΑΤΩΝ

ΔΗΜΙΟΥΡΓΙΑ ΠΕΛΑΤΩΝ ΠΙΝΑΚΑ(ID INT NOT NULL, ΟΝΟΜΑ VARCHAR (20) NOT NULL, AGE INT NOT NULL, CHAR ΔΙΕΥΘΥΝΣΕΩΝ (25) , ΔΕΚΑΔΙΚΟΣ ΜΙΣΘΟΣ (18, 2), ΚΥΡΙΟ ΚΛΕΙΔΙ (ID));

πίνακας ΠΑΡΑΓΓΕΛΙΩΝ

ΔΗΜΙΟΥΡΓΙΑ ΠΑΡΑΓΓΕΛΙΩΝ ΠΙΝΑΚΑ (ID INT NOT NULL, DATE DATETIME, CUSTOMER_ID INT αναφορές CUSTOMERS(ID), AMOUNT double, PRIMARY KEY (ID)).

Εάν ο πίνακας ΠΑΡΑΓΓΕΛΙΕΣ έχει ήδη δημιουργηθεί και το ξένο κλειδί δεν έχει οριστεί ακόμη, τότε η σύνταξη χρησιμοποιείται για τον ορισμό του ξένου κλειδιού τροποποιώντας τον πίνακα.

ΑΛΛΑΓΗ ΠΑΡΑΓΓΕΛΙΩΝ ΠΙΝΑΚΑ ΠΡΟΣΘΗΚΗ ΞΕΝΟΥ ΚΛΕΙΔΙΟΥ (Customer_ID) ΑΝΑΦΟΡΕΣ ΠΕΛΑΤΕΣ (ID);

Κατάργηση περιορισμού ξένου κλειδιού

Για να καταργήσετε έναν περιορισμό ξένου κλειδιού, χρησιμοποιήστε την ακόλουθη σύνταξη SQL.

ΑΛΛΑΓΗ ΠΑΡΑΓΓΕΛΙΩΝ ΠΑΡΑΓΓΕΛΙΩΝ ΠΑΡΑΓΩΓΗΣ ΞΕΝΟΥ ΚΛΕΙΔΙΟΥ.

Σε αυτό το θέμα, χρησιμοποιώντας δύο πίνακες ως παράδειγμα, ορίζονται οι βασικές έννοιες των σχεσιακών βάσεων δεδομένων, και συγκεκριμένα:

  • πρωτεύον κλειδί?
  • ξένο κλειδί?
  • απλό και σύνθετο κλειδί.
  • στάση, τύποι σχέσεων.
  • τεχνητά και φυσικά κλειδιά.
  • κύριοι (κύριοι) και δευτερεύοντες (λεπτομέρεια) πίνακες.

Δεδομένα εισόδου

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

Οι πίνακες έχουν την ακόλουθη δομή.

"Εργάτης". Περιέχει δεδομένα εργαζομένων "Μισθός". Περιέχει πληροφορίες σχετικά με τους μισθούς των εργαζομένων.

Ερώτηση/απάντηση

1. Τι είναι το πρωτεύον κλειδί σε έναν πίνακα βάσης δεδομένων; Σε τι χρησιμεύουν τα πρωτεύοντα κλειδιά;

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

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

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

Παράδειγμα.Για τον πίνακα "Εργαζόμενος", μπορείτε να εισαγάγετε ένα πρόσθετο πεδίο, το οποίο θα είναι το πρωτεύον κλειδί. Ωστόσο, το πεδίο «Personnel number» (ιδιότητα) διασφαλίζει επίσης τη μοναδικότητα. Δεδομένου ότι, θεωρητικά, δεν μπορούν να υπάρχουν δύο ίδιοι αριθμοί προσωπικού. Στην πράξη, μπορεί να υπάρχουν περιπτώσεις όπου ο ίδιος αριθμός προσωπικού εισάγεται κατά λάθος και οι τιμές όλων των πεδίων του πίνακα είναι οι ίδιες. Ως αποτέλεσμα, δύο ίδιες εγγραφές θα εμφανιστούν στον πίνακα. Για να αποφύγετε ένα τέτοιο σφάλμα, είναι καλύτερο να δημιουργήσετε ένα πρόσθετο πεδίο μετρητή στον πίνακα, το οποίο θα εξασφαλίσει μοναδικότητα.

Μπορείτε επίσης να εισαγάγετε ένα επιπλέον πεδίο για τον πίνακα "Μισθός", το οποίο θα είναι το κύριο κλειδί.

2. Ποια είναι η σχέση μεταξύ των πινάκων; Παράδειγμα

Οι πίνακες στο μοντέλο σχεσιακών δεδομένων μπορούν να έχουν σχέσεις μεταξύ τους. Τέτοιες συνδέσεις ονομάζονται σχέσεις. Για τους πίνακες «Εργαζόμενος» και «Μισθός», μπορείτε να δημιουργήσετε μια σύνδεση χρησιμοποιώντας το πεδίο «Αριθμός προσωπικού».

Παράδειγμα.Ας αναλύσουμε τους πίνακες «Εργαζόμενος» και «Μισθός». Σε αυτούς τους πίνακες, μπορείτε να δημιουργήσετε μια σχέση μεταξύ πινάκων με βάση το πεδίο Αριθμός προσωπικού. Δηλαδή, η σύνδεση μεταξύ των πινάκων γίνεται με βάση το πεδίο (ιδιότητα) «Αριθμός προσωπικού».

Αυτό σημαίνει το εξής. Εάν πρέπει να βρείτε δεδουλευμένους μισθούς στον πίνακα "Μισθός" για τον υπάλληλο Ivanov I.I., τότε πρέπει να εκτελέσετε τα ακόλουθα βήματα:

  • βρείτε τον αριθμό προσωπικού του υπαλλήλου Ivanov I.I. στον πίνακα "Εργαζόμενος". Η αξία του αριθμού προσωπικού είναι 7585.
  • στον πίνακα "Μισθός", βρείτε όλες τις τιμές που ισούνται με 7585 (αριθμός προσωπικού).
  • επιλέξτε από τον πίνακα «Μισθός» όλες τις αξίες του πεδίου «Δεδομένα» που αντιστοιχούν στον αριθμό προσωπικού 7585.

Ρύζι. 1. Απεικόνιση της σχέσης μεταξύ πινάκων. Ο αριθμός προσωπικού 2145 του πίνακα «Εργαζόμενος» εμφανίζεται στον πίνακα «Μισθός»

Ρύζι. 2. Σύνδεση (σχέση) μεταξύ πεδίων πίνακα

3. Τι είναι το ξένο κλειδί; Παράδειγμα

Η έννοια του "ξένου κλειδιού" είναι σημαντική όταν εξετάζουμε σχετικούς πίνακες.

Ξένο κλειδί– είναι ένα ή περισσότερα πεδία (χαρακτηριστικά) που είναι κύρια σε έναν άλλο πίνακα και των οποίων η τιμή αντικαθίσταται από τις τιμές του πρωτεύοντος κλειδιού άλλου πίνακα.

Παράδειγμα.Ας υπάρχει σχέση μεταξύ των πινάκων «Εργαζόμενος» και «Μισθός» στο πεδίο «Αριθμός προσωπικού». Σε αυτήν την περίπτωση, το πεδίο «Αριθμός προσωπικού» του πίνακα «Εργαζόμενος» μπορεί να είναι το κύριο κλειδί και το πεδίο «Αριθμός προσωπικού» του πίνακα «Μισθός» μπορεί να είναι ξένο κλειδί. Αυτό σημαίνει ότι οι τιμές του πεδίου «Αριθμός προσωπικού» του πίνακα «Μισθός» αντικαθίστανται από τις τιμές του πεδίου «Αριθμός προσωπικού» του πίνακα «Εργαζόμενος».

4. Τι είναι το αναδρομικό ξένο κλειδί;

Αναδρομικό ξένο κλειδίείναι ένα ξένο κλειδί που αναφέρεται στον ίδιο πίνακα στον οποίο ανήκει. Στην περίπτωση αυτή, το πεδίο (χαρακτηριστικό) που αντιστοιχεί στο ξένο κλειδί είναι το κλειδί της ίδιας σχέσης (σύνδεσμος).

5. Τα πρωτεύοντα και τα ξένα κλειδιά μπορούν να είναι απλά ή σύνθετα (σύνθετα);

Τα πρωτεύοντα, δευτερεύοντα και ξένα κλειδιά μπορεί να είναι είτε απλά είτε σύνθετα (σύνθετα). Απλά κλειδιά– πρόκειται για κλειδιά που περιέχουν μόνο ένα πεδίο (ένα χαρακτηριστικό). ΣύνθετοςΤα (σύνθετα) κλειδιά είναι κλειδιά που περιέχουν πολλά πεδία (χαρακτηριστικά).

6. Ποια είναι η διαφορά μεταξύ τεχνητού και φυσικού κλειδιού; Παράδειγμα

Φυσικό κλειδίπαρέχει μοναδικότητα από την ίδια την ουσία της θεματικής περιοχής. Υπάρχουν περιπτώσεις που οι τιμές των εγγραφών ορισμένων πεδίων (πεδίων) του πίνακα είναι μοναδικές. Αυτό το πεδίο μπορεί να είναι ένα φυσικό κλειδί.

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

Παράδειγμα.Στον πίνακα «Εργαζόμενος», το φυσικό κλειδί είναι το πεδίο (ιδιότητα) «Αριθμός προσωπικού». Το πεδίο «Αριθμός Προσωπικού» είναι μοναδικό από μόνο του, αφού δεν μπορούν να υπάρχουν δύο υπάλληλοι με τον ίδιο αριθμό προσωπικού.

Στον πίνακα "Μισθός", η τιμή και στα τέσσερα πεδία ενδέχεται να επαναληφθεί κατά λάθος. Επομένως, εδώ είναι σκόπιμο να προσθέσετε ένα επιπλέον πεδίο μετρητή, το οποίο θα είναι ένα τεχνητό κλειδί. Σε αυτήν την περίπτωση, ο πίνακας "Μισθός" με ένα πρόσθετο πεδίο μπορεί να μοιάζει κάπως έτσι:

όπου το πεδίο "Αριθμός" είναι ένα τεχνητό κλειδί που εξασφαλίζει μοναδικότητα.

7. Ποιοι είναι οι διαφορετικοί τρόποι επιλογής πρωτεύοντος κλειδιού;

Υπάρχουν 3 τρόποι για να επιλέξετε ένα πρωτεύον κλειδί:

  • χρησιμοποιήστε το πεδίο αύξησης (πεδίο μετρητή) ως τεχνητό κλειδί.
  • επιλέξτε ένα πεδίο από τα δεδομένα που μπορεί να προσφέρει μοναδικότητα.
  • επιλέξτε πολλά πεδία από τα δεδομένα που μπορούν να παρέχουν μοναδικότητα. Σε αυτή την περίπτωση, το κλειδί θα ονομάζεται επίσης σύνθετο (σύνθετο).
8. Τι σημαίνουν οι όροι «κύριος πίνακας» (κύριος) και «δευτερεύων πίνακας» (λεπτομέρεια);

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

Παράδειγμα.Αν λάβουμε υπόψη τους πίνακες «Εργαζόμενος» και «Μισθός», τότε ο πίνακας «Εργαζόμενος» είναι ο κύριος και ο πίνακας «Μισθός» είναι ο δευτερεύων.

9. Τι τύποι σχέσεων (δεσμών) υπάρχουν μεταξύ των πινάκων;

Υπάρχουν 4 κύριοι τύποι σχέσεων μεταξύ των πινάκων:

  • "ένας προς έναν". Σε αυτήν την περίπτωση, κάθε εγγραφή ενός πίνακα αντιστοιχεί μόνο σε μία εγγραφή άλλου πίνακα.
  • "ένας στους πολλούς". Αυτό συμβαίνει όταν μία εγγραφή του κύριου πίνακα (κύριος) αντιστοιχεί σε πολλές εγγραφές του δευτερεύοντος πίνακα (λεπτομέρεια). Δηλαδή, κάθε εγγραφή που είναι το πρωτεύον κλειδί ενός πίνακα αντιστοιχεί σε πολλές εγγραφές του σχετικού πίνακα.
  • "πολλά προς ένα". Αυτό συμβαίνει όταν πολλές εγγραφές του κύριου πίνακα αντιστοιχούν σε μία εγγραφή του δευτερεύοντος πίνακα.
  • "πολλά σε πολλά". Αυτό συμβαίνει όταν υπάρχουν πολλές σχετικές εγγραφές και στους δύο πίνακες.

Παράδειγμα.Αν λάβουμε υπόψη τη σχέση μεταξύ των πινάκων «Εργαζόμενος» και «Μισθός», τότε αυτή η σχέση είναι του τύπου «ένα προς πολλά». Ο πίνακας «Εργαζόμενος» είναι ο κύριος. Ο πίνακας «Μισθός» είναι ένας δευτερεύων πίνακας.

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

1.2.5. Πρωτεύον κλειδί

Έχουμε ήδη μιλήσει πολύ για βασικά πεδία, αλλά δεν τα έχουμε χρησιμοποιήσει ποτέ. Το πιο ενδιαφέρον είναι ότι όλα λειτούργησαν. Αυτό είναι ένα πλεονέκτημα ή ίσως ένα μειονέκτημα των βάσεων δεδομένων Microsoft SQL Server και MS Access. Αυτό το κόλπο δεν θα λειτουργήσει σε πίνακες Paradox και χωρίς πεδίο κλειδιού ο πίνακας θα είναι μόνο για ανάγνωση.

Σε κάποιο βαθμό, τα κλειδιά είναι περιορισμοί και θα μπορούσαν να ληφθούν υπόψη σε συνδυασμό με τη δήλωση CHECK επειδή η δήλωση εμφανίζεται με παρόμοιο τρόπο και χρησιμοποιεί ακόμη και τη δήλωση CONSTRAINT. Ας δούμε αυτή τη διαδικασία με ένα παράδειγμα. Για να γίνει αυτό, θα δημιουργήσουμε έναν πίνακα με δύο πεδία "guid" και "vcName". Αυτό ορίζει το πεδίο "οδηγός" ως πρωτεύον κλειδί:

CREATE TABLE Globally_Unique_Data (μοναδικό αναγνωριστικό οδηγού DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid ΚΥΡΙΟ ΚΛΕΙΔΙ (Οδηγός))

Το καλύτερο μέρος εδώ είναι η γραμμή CONSTRAINT. Όπως γνωρίζουμε, αυτή η λέξη-κλειδί ακολουθείται από το όνομα του περιορισμού και η δήλωση κλειδιού δεν αποτελεί εξαίρεση. Για να ονομάσετε ένα πρωτεύον κλειδί, προτείνω να χρησιμοποιήσετε έναν τύπο ονομασίας PK_name, όπου όνομα είναι το όνομα του πεδίου που θα πρέπει να γίνει το κύριο κλειδί. Η συντομογραφία PK προέρχεται από το Primary Key.

Μετά από αυτό, αντί για τη λέξη-κλειδί CHECK, που χρησιμοποιήσαμε στους περιορισμούς, υπάρχει ένας τελεστής ΠΡΩΤΙΚΟ ΚΛΕΙΔΙ Αυτός είναι που δείχνει ότι δεν χρειαζόμαστε έλεγχο, αλλά πρωτεύον κλειδί. Ένα ή περισσότερα πεδία που θα αποτελέσουν το κλειδί υποδεικνύονται σε παρένθεση.

Να θυμάστε ότι καμία δύο σειρές δεν μπορούν να έχουν την ίδια τιμή σε ένα πεδίο κλειδιού, στο οποίο ένας περιορισμός πρωτεύοντος κλειδιού είναι πανομοιότυπος με έναν μοναδικό περιορισμό. Αυτό σημαίνει ότι εάν κάνετε το πεδίο για την αποθήκευση του επωνύμου ως πρωτεύον κλειδί, τότε δεν θα είναι δυνατό να γράψετε δύο Ivanov με διαφορετικά ονόματα σε έναν τέτοιο πίνακα. Αυτό παραβιάζει τον περιορισμό του πρωτεύοντος κλειδιού. Αυτός είναι ο λόγος για τον οποίο τα κλειδιά είναι περιορισμοί και δηλώνονται με τον ίδιο τρόπο όπως ένας περιορισμός CHECK. Αλλά αυτό δεν ισχύει μόνο για πρωτεύοντα κλειδιά και δευτερεύοντα κλειδιά με μοναδικότητα.

Σε αυτό το παράδειγμα, το πρωτεύον κλειδί είναι ένα πεδίο τύπου μοναδικό αναγνωριστικό (GUID). Η προεπιλεγμένη τιμή για αυτό το πεδίο είναι το αποτέλεσμα της διαδικασίας διακομιστή NEWID.

Προσοχή

Μόνο ένα πρωτεύον κλειδί μπορεί να δημιουργηθεί για έναν πίνακα

Για την απλοποίηση των παραδειγμάτων, καλό είναι να χρησιμοποιήσετε έναν αριθμητικό τύπο ως κλειδί και, εάν το επιτρέπει η βάση δεδομένων, θα ήταν καλύτερο να είναι τύπου «αυτόματη αύξηση» (αυτόματη αύξηση/μείωση αριθμού). Στον MS SQL Server αυτό το πεδίο είναι ΤΑΥΤΟΤΗΤΑ και στο MS Access είναι πεδίο τύπου "counter".

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

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ Προϊόντα (αναγνωριστικό IDENTITY(1, 1), varchar προϊόντος(50), Τιμή χρηματική, Αριθμητική ποσότητα(10, 2), CONSTRAINT PK_id ΚΥΡΙΟ ΚΛΕΙΔΙ (ID))

Αυτός ο τύπος κλειδιού θα χρησιμοποιούμε πιο συχνά, επειδή το πεδίο κλειδιού θα αποθηκεύει αριθμούς που είναι εύκολα κατανοητοί και θα είναι ευκολότερος και πιο οπτικός στην εργασία.

Ένα πρωτεύον κλειδί μπορεί να αποτελείται από περισσότερες από μία στήλες. Το παρακάτω παράδειγμα δημιουργεί έναν πίνακα στον οποίο τα πεδία "id" και "Product" αποτελούν το πρωτεύον κλειδί, πράγμα που σημαίνει ότι θα δημιουργηθεί ένα μοναδικό ευρετήριο και στα δύο πεδία:

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ Προϊόντα1 (αναγνωριστικό int IDENTITY(1, 1), Varchar προϊόντος (50), Χρηματική τιμή, Αριθμητική ποσότητα (10, 2), CONSTRAINT PK_id ΚΥΡΙΟ ΚΛΕΙΔΙ (αναγνωριστικό, [Όνομα προϊόντος]))

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

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

1.2.6. Ξένο κλειδί

Ένα ξένο κλειδί είναι επίσης ένας περιορισμός CONSTRAINT και αντιπροσωπεύει τη σχέση μεταξύ δύο πινάκων. Ας υποθέσουμε ότι έχετε δύο πίνακες:

  • Ονόματα – περιέχει τα ονόματα των ατόμων και αποτελείται από πεδία αναγνώρισης (πεδίο κλειδιού), όνομα.
  • Το Phones είναι ένας τηλεφωνικός πίνακας που αποτελείται από ένα αναγνωριστικό (πεδίο κλειδιού), ένα ξένο κλειδί για σύνδεση στον πίνακα ονομάτων και ένα πεδίο συμβολοσειράς για την αποθήκευση του αριθμού τηλεφώνου.

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

Για παράδειγμα, ας πάρουμε ένα τραπέζι τριών ατόμων. Ο Πίνακας 1.3 δείχνει τα περιεχόμενα του πίνακα "Ονόματα". Υπάρχουν μόνο τρεις γραμμές και η καθεμία έχει το δικό της μοναδικό κύριο κλειδί. Για μοναδικότητα, όταν δημιουργούμε έναν πίνακα, θα κάνουμε το κλειδί ένα αυτόματα αυξανόμενο πεδίο.

Πίνακας 1.3 Περιεχόμενα του πίνακα Ονομάτων

Πίνακας 1.4. Περιεχόμενα του πίνακα Τηλέφωνα

Ο Πίνακας 1.4 περιέχει πέντε αριθμούς τηλεφώνου. Το πεδίο κύριου κλειδιού περιέχει επίσης ένα μοναδικό κύριο κλειδί, το οποίο μπορεί επίσης να αυξηθεί αυτόματα. Ένα δευτερεύον κλειδί είναι μια σχέση με το πρωτεύον κλειδί του πίνακα Ονομάτων. Πώς λειτουργεί αυτή η σύνδεση; Ο Petrov έχει τον αριθμό 1 ως κύριο κλειδί στον πίνακα Ονόματα Στον πίνακα Τηλέφωνα, στο δευτερεύον κλειδί, αναζητούμε τον αριθμό 1 και παίρνουμε τους αριθμούς τηλεφώνου του Petrov. Το ίδιο ισχύει και για τις υπόλοιπες συμμετοχές. Οπτικά η σύνδεση φαίνεται στο Σχήμα 1.5.

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

Μπορείτε να δημιουργήσετε πολλά πεδία Ονόματα σε έναν πίνακα, αλλά τίθεται το ερώτημα - πόσα. Ένα άτομο μπορεί να έχει μόνο 1 τηλέφωνο, αλλά εγώ, για παράδειγμα, έχω 3, χωρίς να υπολογίζω τα εργασιακά. Ένας μεγάλος αριθμός πεδίων οδηγεί σε πλεονασμό δεδομένων.

Μπορείτε να δημιουργήσετε μια ξεχωριστή σειρά με το επίθετο για κάθε τηλέφωνο στον πίνακα Ονόματα, αλλά αυτό είναι εύκολο μόνο για ένα τόσο απλό παράδειγμα, όταν χρειάζεται μόνο να εισαγάγετε το επώνυμο και μπορείτε εύκολα να κάνετε πολλές εγγραφές για τον Petrov με πολλά τηλέφωνα αριθμοί. Τι γίνεται αν υπάρχουν 10 ή 20 πεδία; Έτσι, η δημιουργία δύο πινάκων που συνδέονται με ένα ξένο κλειδί φαίνεται στην Λίστα 1.6.

Λίστα 1.6. Δημιουργία πινάκων που συνδέονται με ξένο κλειδί

CREATE TABLE Names (idName int IDENTITY(1,1), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName),) CREATE TABLE Phones (idPhone int IDENTITY(1,1), idName int, vcPhone(10), ΠΕΡΙΟΡΙΣΜΟΣ PK_idPhone ΚΥΡΙΟ ΚΛΕΙΔΙ (idPhone), CONSTRAINT FK_idName ΞΕΝΟ ΚΛΕΙΔΙ (idName) ΑΝΑΦΟΡΕΣ Ονόματα (idName))

Ελέγξτε προσεκτικά τα περιεχόμενα της καταχώρισης. Είναι αρκετά ενδιαφέρον γιατί χρησιμοποιεί μερικούς από τους χειριστές που έχουμε ήδη καλύψει και ένα επιπλέον παράδειγμα θα ήταν χρήσιμο. Και για τους δύο πίνακες δημιουργείται ένα πεδίο κλειδιού, το οποίο έρχεται πρώτο, είναι τύπου int και προσαυξάνεται αυτόματα, ξεκινώντας από 1 σε προσαυξήσεις του ενός. Το πεδίο κλειδιού γίνεται το κύριο κλειδί χρησιμοποιώντας έναν περιορισμό CONSTRAINT.

Στην περιγραφή του πίνακα Τηλέφωνα, η τελευταία γραμμή περιέχει μια νέα δήλωση για εμάς, δηλαδή τη δήλωση ενός ξένου κλειδιού χρησιμοποιώντας τον τελεστή ΞΕΝΟ ΚΛΕΙΔΙ. Όπως μπορείτε να δείτε, είναι και αυτός ένας περιορισμός και λίγο αργότερα θα δείτε γιατί. Το πεδίο πίνακα που πρέπει να συνδεθεί με έναν άλλο πίνακα υποδεικνύεται σε παρένθεση. Μετά από αυτό έρχεται η λέξη-κλειδί REFERENCES (σύνδεσμος), το όνομα του πίνακα με τον οποίο πρέπει να είναι η σύνδεση (Names) και σε παρένθεση το όνομα του πεδίου ("idName"). Έτσι, κάναμε μια σύνδεση, η οποία φαίνεται στο σχήμα 1.4.

Προσοχή!

Ένα ξένο κλειδί μπορεί να αναφέρεται μόνο στο πρωτεύον κλειδί ή στον μοναδικό περιορισμό άλλου πίνακα. Αυτό σημαίνει ότι μετά τη λέξη-κλειδί REFERENCES πρέπει να υπάρχει ένα όνομα πίνακα και μόνο ένα πρωτεύον κλειδί ή ένα πεδίο με ΜΟΝΑΔΙΚΟ περιορισμό μπορεί να καθοριστεί σε παρένθεση. Δεν μπορούν να καθοριστούν άλλα πεδία.

Τώρα, αν μπορείτε να γεμίσετε τους πίνακες με δεδομένα. Οι επόμενες τρεις ομάδες προσθέτουν τα τρία ονόματα που είδαμε στον Πίνακα 1.3:

INSERT INTO Names(vcName) VALUES("Petrov") INSERT INTO Names(vcName) VALUES("Ivanov") INSERT INTO Names(vcName) VALUES("Sidorov")

Εάν έχετε ήδη εργαστεί με SQL, μπορείτε να προσθέσετε καταχωρήσεις για τον τηλεφωνικό πίνακα. Θα παραλείψω αυτές τις εντολές, αλλά μπορείτε να τις δείτε στο αρχείο Foreign_keys.sql στον κατάλογο Chapter1 στο CD.

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

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

Όταν δημιουργείτε ένα ξένο κλειδί, μπορείτε να ορίσετε ON DELETE CASCADE ή ON UPDATE CASCADE. Σε αυτήν την περίπτωση, εάν διαγράψετε την εγγραφή του Petrov από τον πίνακα Ονόματα ή αλλάξετε το αναγνωριστικό, τότε όλες οι εγγραφές στον πίνακα Τηλέφωνα που σχετίζονται με τη σειρά του Petrov θα ενημερωθούν αυτόματα. Ποτέ. Όχι, πρέπει να γράφεται με κεφαλαία γράμματα: ΠΟΤΕ μην το κάνετε αυτό. Όλα πρέπει να διαγραφούν ή να αλλάξουν χειροκίνητα. Εάν ένας χρήστης διαγράψει κατά λάθος μια καταχώρηση από τον πίνακα Ονομάτων, διαγράφονται και τα αντίστοιχα τηλέφωνα. Δεν έχει νόημα να δημιουργήσετε ένα ξένο κλειδί εάν εξαφανιστούν οι μισοί από τους περιορισμούς του! Όλα πρέπει να γίνονται χειροκίνητα και δεν συνιστάται ποτέ η αλλαγή αναγνωριστικών.

Η διαγραφή των ίδιων των πινάκων θα πρέπει επίσης να ξεκινά από τον δευτερεύοντα πίνακα, δηλαδή με τηλέφωνα, και μόνο τότε μπορείτε να διαγράψετε τον κύριο πίνακα Ονομάτων.

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

SELECT vcName, vcPhone FROM Names, Phones WHERE Names.idName=Phones.idName

Θα μιλήσουμε για τέτοια ερωτήματα με περισσότερες λεπτομέρειες στο Κεφάλαιο 2. Προς το παρόν, έδωσα ένα παράδειγμα μόνο για να μπορείτε να δείτε τη δύναμη των συνδεδεμένων πινάκων.

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

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

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

Πίνακας 1.5. Πίνακας με εσωτερικό σύνδεσμο

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

Ας δούμε πώς μπορούμε να δημιουργήσουμε όλα αυτά ως ερώτημα SQL:

CREATE TABLE Positions (idPosition int IDENTITY(1,1), idParentPosition int, vcName varchar(30), CONSTRAINT PK_idPosition PRIMARY KEY (idPosition), CONSTRAINT FK_idParentPosition FOREIGN KEY (idParentPoitions)

Όπως μπορείτε να δείτε, το ξένο κλειδί απλώς αναφέρεται στον ίδιο πίνακα που δημιουργούμε. Στο CD, στον κατάλογο Chapter1, μπορείτε να δείτε στο αρχείο Foreign_keys_to_self.sql ένα παράδειγμα δημιουργίας αυτού του πίνακα, πλήρωσής του με δεδομένα και εμφάνισης θέσεων λαμβάνοντας υπόψη την υποταγή τους. Στο επόμενο κεφάλαιο θα δούμε αναλυτικότερα τη δυνατότητα εργασίας με τέτοιους πίνακες.

Σχέση ένας προς έναν

Μέχρι στιγμής, έχουμε εξετάσει την κλασική σχέση, όταν μία γραμμή του κύριου πίνακα δεδομένων αντιστοιχεί σε μία γραμμή από τον σχετικό πίνακα. Αυτή η σχέση ονομάζεται ένα προς πολλά. Αλλά υπάρχουν και άλλες συνδέσεις, και τώρα θα δούμε μια άλλη - ένα προς ένα, όταν μια εγγραφή στον κύριο πίνακα συνδέεται με μια εγγραφή μιας άλλης. Για την υλοποίηση αυτού, αρκεί να συνδέσετε τα πρωτεύοντα κλειδιά και των δύο πινάκων. Δεδομένου ότι τα πρωτεύοντα κλειδιά δεν μπορούν να επαναληφθούν, μόνο μία σειρά μπορεί να συσχετιστεί και στους δύο πίνακες.

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

CREATE TABLE Names (idName uniqueidentifier DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName)) CREATE TABLE Phones (idPhone uniqueidentifier DEFAULT NEWID(), vcPhone CONSTRANSHOINThone ΠΕΡΙΟΡΙΣΜΟΣ FK_idPhone ΞΕΝΟ ΚΛΕΙΔΙ (idPhone) ΑΝΑΦΟΡΕΣ Ονόματα (idName))

Μόνο ένας από τους πίνακες χρειάζεται ξένο κλειδί. Δεδομένου ότι η σχέση είναι ένα προς ένα, δεν έχει σημασία σε ποιον πίνακα θα τη δημιουργήσετε.

πολλά σε πολλά

Η πιο περίπλοκη σχέση είναι πολλά-προς-πολλά, όπου πολλές εγγραφές από έναν πίνακα ταιριάζουν με πολλές εγγραφές από έναν άλλο πίνακα. Για να υλοποιηθεί αυτό, δεν χρειάζονται δύο πίνακες.

Πρώτα πρέπει να καταλάβουμε πότε μπορεί να χρησιμοποιηθεί μια σχέση πολλά-προς-πολλά; Ας υποθέσουμε ότι έχετε δύο πίνακες: μια λίστα με τους κατοίκους του σπιτιού και μια λίστα με αριθμούς τηλεφώνου. Ένα διαμέρισμα μπορεί να έχει περισσότερους από έναν αριθμούς, πράγμα που σημαίνει ότι ένα επώνυμο μπορεί να έχει δύο αριθμούς τηλεφώνου. Αποδεικνύεται ότι υπάρχει μια σχέση ένα προς πολλά. Από την άλλη πλευρά, μπορεί να υπάρχουν δύο οικογένειες σε ένα διαμέρισμα (ένα κοινόχρηστο διαμέρισμα ή απλώς ένας ενοικιαστής που χρησιμοποιεί το τηλέφωνο του ιδιοκτήτη), πράγμα που σημαίνει ότι η σύνδεση μεταξύ του τηλεφώνου και του κατοίκου είναι επίσης μία προς πολλές. Και η πιο δύσκολη επιλογή είναι να έχετε δύο τηλέφωνα σε ένα κοινόχρηστο διαμέρισμα. Σε αυτήν την περίπτωση, και οι δύο αριθμοί χρησιμοποιούνται από αρκετούς κατοίκους του διαμερίσματος. Έτσι, αποδεικνύεται ότι «πολλές» οικογένειες μπορούν να χρησιμοποιήσουν «πολλά» τηλέφωνα (επικοινωνία πολλών-προς-πολλών).

Πώς να εφαρμόσετε μια σχέση πολλά προς πολλά; Με την πρώτη ματιά, αυτό είναι αδύνατο στο σχεσιακό μοντέλο. Πριν από περίπου 10 χρόνια έψαχνα για διαφορετικές επιλογές για μεγάλο χρονικό διάστημα και ως αποτέλεσμα δημιούργησα απλώς έναν πίνακα που ήταν γεμάτος με περιττά δεδομένα. Αλλά μια μέρα, μου δόθηκε μια εργασία, χάρη στην οποία προέκυψε μια εξαιρετική λύση από τις συνθήκες - έπρεπε να δημιουργήσω δύο πίνακες κατοίκων διαμερισμάτων και αριθμούς τηλεφώνου και να εφαρμόσω μόνο ένα πρωτεύον κλειδί σε αυτούς. Δεν χρειάζονται ξένα κλειδιά σε αυτόν τον πίνακα. Αλλά η σύνδεση μεταξύ των τραπεζιών πρέπει να γίνεται μέσω ενός τρίτου, συνδετικού πίνακα. Με την πρώτη ματιά, αυτό είναι δύσκολο και ασαφές, αλλά μόλις κατανοήσετε αυτήν τη μέθοδο, θα δείτε την πλήρη ισχύ αυτής της λύσης.

Οι πίνακες 1.6 και 1.7 δείχνουν παραδείγματα πινάκων επωνύμων και τηλεφώνου, αντίστοιχα. Και ο Πίνακας 1.8 δείχνει τον πίνακα σύνδεσης.

Πίνακας 1.6. Πίνακας επωνύμων

Πίνακας 1.7. Τηλεφωνικό τραπέζι

Πίνακας 1.8. Τηλεφωνικό τραπέζι

Ας δούμε τώρα πώς θα είναι η λογική αναζήτησης δεδομένων σε μια σχέση πολλά προς πολλά. Ας πούμε ότι πρέπει να βρούμε όλα τα τηλέφωνα που ανήκουν στον Ιβάνοφ. Το πρωτεύον κλειδί του Ivanov είναι ίσο με 1. Βρίσκουμε στον πίνακα σύνδεσης όλες τις εγγραφές για τις οποίες το πεδίο "Σχέση με το όνομα" είναι ίσο με 1. Αυτές θα είναι οι εγγραφές 1 και 2. Σε αυτές τις εγγραφές στο πεδίο "Σχέση με το τηλέφωνο" εκεί είναι τα αναγνωριστικά 1 και 2, αντίστοιχα, και Αυτό σημαίνει ότι ο Ivanov κατέχει τους αριθμούς από τον τηλεφωνικό πίνακα, οι οποίοι βρίσκονται στις γραμμές 1 και 2.

Τώρα ας λύσουμε το αντίστροφο πρόβλημα - προσδιορίστε ποιος έχει πρόσβαση στον αριθμό τηλεφώνου 567575677. Αυτός ο αριθμός στον τηλεφωνικό πίνακα έχει το κλειδί 3. Αναζητούμε όλες τις εγγραφές στον πίνακα σύνδεσης, όπου στο πεδίο "Σύνδεση τηλεφώνου" ισούται με 3. Πρόκειται για εγγραφές με αριθμούς 4 και 5, οι οποίες στο πεδίο «Σύνδεσμος ονόματος» περιέχουν τις τιμές 2 και 3, αντίστοιχα. Αν κοιτάξετε τώρα τον πίνακα των επωνύμων, θα δείτε τους Petrov και Sidorov στους αριθμούς 2 και 3. Αυτό σημαίνει ότι οι δύο αυτοί κάτοικοι χρησιμοποιούν τον αριθμό τηλεφώνου 567575677.

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

Δημιουργία ονομάτων πίνακα (IDName UniqueIdentifier default NewId (), VCName varchar (50), Constraint PK_Guid Πρωτογενές κλειδί (IDName)) Δημιουργία τηλεφώνων πίνακα (IdPhone UniqueIdentifier DefaultID (), VCPhone Varchar (10) ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑΣ LinkTable (IDLinkTable uniqueidentifier DEFAULT NEWID(), idName uniqueidentifier, idPhone uniqueidentifier, CONSTRAINT PK_idLinkTable PRIMARY KEY (idLinkTable), CONSTRAINT FK_idPhone ΞΕΝΟ ΚΛΕΙΔΙ (sRENSFENThone) εμένα ΞΕΝΟ ΚΛΕΙΔΙ (idName REF) ERENCES Ονόματα (idName ) )

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

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

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

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