Ξένο Κλειδί SQL Server: Πώς να δημιουργήσετε με παράδειγμα

⚡ Έξυπνη Σύνοψη

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

  • 🔗 Τι είναι ένα ξένο κλειδί: Ένα ξένο κλειδί συνδέει έναν θυγατρικό πίνακα με έναν γονικό πίνακα και επιβάλλει την ακεραιότητα αναφορών μεταξύ τους.
  • 👪 Γονέας και παιδί: Ο πίνακας στον οποίο γίνεται αναφορά είναι ο γονέας, ενώ ο πίνακας που περιέχει το ξένο κλειδί είναι ο θυγατρικός, ο οποίος δείχνει στο πρωτεύον κλειδί του γονέα.
  • 🖱️ Δύο μέθοδοι δημιουργίας: Οι σχέσεις του SQL Server Management Studio και η ρήτρα T-SQL CREATE TABLE … FOREIGN KEY … REFERENCES ορίζουν και οι δύο ένα ξένο κλειδί.
  • Προσθήκη σε υπάρχοντα πίνακα: ΑΛΛΑΓΗ ΠΙΝΑΚΑ … ΠΡΟΣΘΗΚΗ ΠΕΡΙΟΡΙΣΜΟΥ … Το ΞΕΝΟ ΚΛΕΙΔΙ προσθέτει τη σχέση σε έναν πίνακα που ήδη υπάρχει.
  • 🔄 Ενέργειες αναφοράς: Οι όροι ON DELETE και ON UPDATE ελέγχουν τις θυγατρικές γραμμές με τις τιμές NO ACTION, CASCADE, SET NULL ή SET DEFAULT.
  • Integrity ελέγξτε: Η εισαγωγή μιας θυγατρικής γραμμής της οποίας το κλειδί δεν έχει αντίστοιχη γονική γραμμή απορρίπτεται, διατηρείται.ping τα δεδομένα συνεπή.

Ξένο Κλειδί SQL Server: Πώς να δημιουργήσετε στον SQL Server με ένα παράδειγμα

Τι είναι το Ξένο ΚΛΕΙΔΙ;

Ένα ξένο κλειδί παρέχει έναν τρόπο επιβολής της ακεραιότητας αναφοράς εντός Ο SQL ServerΜε απλά λόγια, ένα ξένο κλειδί διασφαλίζει ότι οι τιμές σε έναν πίνακα πρέπει να υπάρχουν και σε έναν άλλο πίνακα.

Κανόνες για ΞΕΝΟ ΚΛΕΙΔΙ

  • Η τιμή NULL επιτρέπεται σε ένα ξένο κλειδί SQL.
  • Ο πίνακας στον οποίο γίνεται αναφορά ονομάζεται γονικός πίνακας.
  • Ο πίνακας με το ξένο κλειδί ονομάζεται θυγατρικός πίνακας.
  • Το ξένο κλειδί στον θυγατρικό πίνακα αναφέρεται στο πρωτεύων κλειδί στον γονικό πίνακα.
  • Αυτή η σχέση γονέα-παιδιού επιβάλλει τον κανόνα που είναι γνωστός ως «αναφορική ακεραιότητα».

Το παρακάτω διάγραμμα συνοψίζει όλα τα παραπάνω σημεία για το ξένο κλειδί.

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

Πώς να δημιουργήσετε ΞΕΝΟ ΚΛΕΙΔΙ σε SQL

Μπορείτε να δημιουργήσετε ένα ξένο κλειδί στον SQL Server με δύο τρόπους:

Στούντιο διαχείρισης διακομιστή SQL

Γονικός Πίνακας: Ας υποθέσουμε ότι έχουμε έναν υπάρχοντα γονικό πίνακα με το όνομα 'Course'. Τα Course_ID και Course_name είναι δύο στήλες, με το Course_Id ως το πρωτεύον κλειδί.

Γονικός πίνακας Course με πρωτεύον κλειδί Course_Id και στήλες Course_name

Θυγατρικός Πίνακας: Πρέπει να δημιουργήσουμε τον δεύτερο πίνακα ως θυγατρικό πίνακα. Οι δύο στήλες του είναι 'Course_ID' και 'Course_Strength'. Ωστόσο, το 'Course_ID' θα είναι το ξένο κλειδί.

Βήμα 1) Κάντε δεξί κλικ στους Πίνακες > Νέος > Πίνακας…

Κάντε δεξί κλικ στο στοιχείο Πίνακες, έπειτα στο στοιχείο Δημιουργία και, στη συνέχεια, στο στοιχείο Πίνακας στο SQL Server Management Studio

Βήμα 2) Εισαγάγετε δύο ονόματα στηλών ως 'Course_ID' και 'Course_Strength'. Κάντε δεξί κλικ στη στήλη 'Course_Id' και, στη συνέχεια, κάντε κλικ στην επιλογή Σχέση.

Νέες θυγατρικές στήλες πίνακα Course_ID και Course_Strength με το μενού Relationship

Βήμα 3) Στις «Σχέσεις Ξένου Κλειδιού», κάντε κλικ στην επιλογή «Προσθήκη».

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

Βήμα 4) Στην ενότητα «Προδιαγραφές πινάκων και στηλών», κάντε κλικ στο εικονίδιο «…».

Πεδίο Προδιαγραφών Πινάκων και Στηλών με το κουμπί αποσιώπησης

Βήμα 5) Επιλέξτε τον «Πίνακα Πρωτεύοντος Κλειδιού» ως «ΜΑΘΗΜΑ» και τον νέο πίνακα που δημιουργείται ως «Πίνακα Ξένων Κλειδιών» από το αναπτυσσόμενο μενού.

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

Βήμα 6) Για τον «Πίνακα Πρωτεύοντος Κλειδιού», επιλέξτε τη στήλη «Course_Id» ως τη στήλη του πίνακα πρωτεύοντος κλειδιού.

Για τον «Πίνακα ξένων κλειδιών», επιλέξτε τη στήλη «Course_Id» ως τη στήλη του πίνακα ξένων κλειδιών. Κάντε κλικ στο OK.

Χάρτηςping Course_Id ως στήλες πρωτεύοντος κλειδιού και ξένου κλειδιού

Βήμα 7) Κάντε κλικ στην επιλογή Προσθήκη.

Κάνοντας κλικ στην επιλογή Προσθήκη για να επιβεβαιώσετε τη σχέση του ξένου κλειδιού

Βήμα 8) Δώστε στον πίνακα το όνομα 'Course_Strength' και κάντε κλικ στο OK.

Ονομασία του θυγατρικού πίνακα Course_Strength και κλικ στο OK

Αποτέλεσμα: Έχουμε ορίσει μια σχέση γονέα-θυγατρικού μεταξύ των 'Course' και 'Course_Strength'.

Σχέση γονέα-παιδιού που δημιουργείται μεταξύ του Course και του Course_Strength

T-SQL: Δημιουργία πίνακα γονέα-θυγατρικού χρησιμοποιώντας την T-SQL

Γονικός Πίνακας: Επαναλάβετε το ενδεχόμενο να έχουμε έναν υπάρχοντα γονικό πίνακα με το όνομα 'Course'. Τα Course_ID και Course_name είναι δύο στήλες, με το Course_Id ως το πρωτεύον κλειδί.

Υπάρχων γονικός πίνακας Course με Course_Id ως πρωτεύον κλειδί

Θυγατρικός Πίνακας: Πρέπει να δημιουργήσουμε τον δεύτερο πίνακα ως θυγατρικό πίνακα με το όνομα 'Course_Strength_TSQL'. Οι δύο στήλες του είναι 'Course_ID' και 'Course_Strength'. Ωστόσο, το 'Course_ID' θα είναι το ξένο κλειδί.

Παρακάτω είναι η σύνταξη για δημιουργήστε έναν πίνακα με ΞΕΝΙΚΟ ΚΛΕΙΔΙ.

Σύνταξη:

CREATE TABLE childTable
(
  column_1 datatype [ NULL |NOT NULL ],
  column_2 datatype [ NULL |NOT NULL ],
  ...

  CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n)
    [ ON DELETE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ]
    [ ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] 
);

Ακολουθεί μια περιγραφή των παραπάνω παραμέτρων:

  • childTable είναι το όνομα του πίνακα που πρόκειται να δημιουργηθεί.
  • Οι στήλες column_1, column_2 είναι οι στήλες που θα προστεθούν στον πίνακα.
  • Το fkey_name είναι το όνομα του περιορισμού ξένου κλειδιού που θα δημιουργηθεί.
  • child_column1, child_column2 … child_column_n είναι οι θυγατρικές στήλες του πίνακα που αναφέρονται στο πρωτεύον κλειδί στον γονικό πίνακα.
  • Το parentTable είναι το όνομα του γονικού πίνακα του οποίου το κλειδί αναφέρεται στον θυγατρικό πίνακα.
  • parent_column1, parent_column2 … parent_column_n είναι οι στήλες που αποτελούν το πρωτεύον κλειδί του γονικού πίνακα.
  • Η παράμετρος ON DELETE είναι μια προαιρετική παράμετρος που καθορίζει τι συμβαίνει στα θυγατρικά δεδομένα μετά τη διαγραφή των γονικών δεδομένων. Οι τιμές περιλαμβάνουν NO ACTION, SET NULL, CASCADE ή SET DEFAULT.
  • Η παράμετρος ON UPDATE είναι μια προαιρετική παράμετρος που καθορίζει τι συμβαίνει στα θυγατρικά δεδομένα μετά την ενημέρωση των γονικών δεδομένων. Οι τιμές περιλαμβάνουν NO ACTION, SET NULL, CASCADE ή SET DEFAULT.
  • Η ένδειξη ΚΑΜΙΑ ΕΝΕΡΓΕΙΑ σημαίνει ότι δεν συμβαίνει τίποτα στα δεδομένα του παιδιού μετά την ενημέρωση ή τη διαγραφή των δεδομένων του γονέα.
  • Το CASCADE σημαίνει ότι τα θυγατρικά δεδομένα διαγράφονται ή ενημερώνονται μετά τη διαγραφή ή την ενημέρωση των γονικών δεδομένων.
  • Η τιμή SET NULL σημαίνει ότι τα θυγατρικά δεδομένα ορίζονται σε null μετά την ενημέρωση ή τη διαγραφή των γονικών δεδομένων.
  • Η επιλογή SET DEFAULT (ΟΡΙΣΜΟΣ ΠΡΟΕΠΙΛΟΓΗΣ) σημαίνει ότι τα θυγατρικά δεδομένα ορίζονται στην προεπιλεγμένη τιμή τους μετά από μια ενημέρωση ή διαγραφή των γονικών δεδομένων.

Ας δούμε ένα παράδειγμα ξένου κλειδιού που δημιουργεί έναν πίνακα με μία στήλη ως ΞΕΝΟ ΚΛΕΙΔΙ, χρησιμοποιώντας ένα Τύπος δεδομένων για κάθε στήλη.

Παράδειγμα ξένου κλειδιού σε SQL

Ερώτηση:

CREATE TABLE Course_Strength_TSQL
(
Course_ID Int,
Course_Strength Varchar(20) 
CONSTRAINT FK FOREIGN KEY (Course_ID)
REFERENCES COURSE (Course_ID)	
)

Βήμα 1) Εκτελέστε το ερώτημα κάνοντας κλικ στην επιλογή Εκτέλεση.

Εκτέλεση του ερωτήματος CREATE TABLE που ορίζει το ξένο κλειδί Course_ID

Αποτέλεσμα: Έχουμε ορίσει μια σχέση γονέα-θυγατρικού μεταξύ των 'Course' και 'Course_Strength_TSQL'.

Δημιουργήθηκε σχέση γονέα-παιδιού μεταξύ Course και Course_Strength_TSQL

Χρήση ALTER TABLE

Τώρα θα μάθουμε πώς να προσθέσουμε ένα ξένο κλειδί στον SQL Server σε έναν πίνακα που υπάρχει ήδη χρησιμοποιώντας την εντολή ALTER TABLE. Θα χρησιμοποιήσουμε την παρακάτω σύνταξη:

ALTER TABLE childTable
ADD CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n);

Ακολουθεί μια περιγραφή των παραμέτρων που χρησιμοποιήθηκαν παραπάνω:

  • childTable είναι το όνομα του πίνακα που πρόκειται να δημιουργηθεί.
  • Οι στήλες column_1, column_2 είναι οι στήλες που θα προστεθούν στον πίνακα.
  • Το fkey_name είναι το όνομα του περιορισμού ξένου κλειδιού που θα δημιουργηθεί.
  • child_column1, child_column2 … child_column_n είναι οι θυγατρικές στήλες του πίνακα που αναφέρονται στο πρωτεύον κλειδί στον γονικό πίνακα.
  • Το parentTable είναι το όνομα του γονικού πίνακα του οποίου το κλειδί αναφέρεται στον θυγατρικό πίνακα.
  • parent_column1, parent_column2 … parent_column_n είναι οι στήλες που αποτελούν το πρωτεύον κλειδί του γονικού πίνακα.

Παράδειγμα προσθήκης ξένου κλειδιού ALTER TABLE:

ALTER TABLE department
ADD CONSTRAINT fkey_student_admission
    FOREIGN KEY (admission)
    REFERENCES students (admission);

Έχουμε δημιουργήσει ένα ξένο κλειδί με το όνομα fkey_student_admission στον πίνακα του τμήματος. Αυτό το ξένο κλειδί αναφέρεται στη στήλη αποδοχής του πίνακα μαθητών.

Παράδειγμα ερωτήματος Ξένο ΚΛΕΙΔΙ

Αρχικά, ας δούμε τα δεδομένα του γονικού μας πίνακα, COURSE.

Ερώτηση:

SELECT * from COURSE;

Αποτέλεσμα SELECT που εμφανίζει τα δεδομένα του γονικού πίνακα COURSE

Τώρα ας εισαγάγουμε μερικές γραμμές στον θυγατρικό πίνακα 'Course_Strength_TSQL'. Θα προσπαθήσουμε να εισαγάγουμε δύο τύπους γραμμών:

  • Ο πρώτος τύπος, για τον οποίο το Course_Id στον θυγατρικό πίνακα υπάρχει στο Course_Id του γονικού πίνακα, δηλαδή, Course_Id = 1 και 2.
  • Ο δεύτερος τύπος, για τον οποίο το Course_Id στον θυγατρικό πίνακα δεν υπάρχει στο Course_Id του γονικού πίνακα, δηλαδή, Course_Id = 5.

Ερώτηση:

Insert into COURSE_STRENGTH values (1,'SQL');
Insert into COURSE_STRENGTH values (2,'Python');
Insert into COURSE_STRENGTH values (5,'PERL');

Εισαγωγή θυγατρικών γραμμών, συμπεριλαμβανομένου του Course_ID 5 που δεν έχει αντίστοιχο γονικό στοιχείο

Αποτέλεσμα: Ας εκτελέσουμε το ερώτημα μαζί για να δούμε τους γονικούς και τους θυγατρικούς πίνακες μας.

Οι γραμμές με Course_ID 1 και 2 υπάρχουν στον πίνακα Course_Strength. Το Course_ID 5, ωστόσο, αποτελεί εξαίρεση, επειδή δεν έχει αντίστοιχη γραμμή στον γονικό πίνακα.

Συγκρίνονται οι γονικοί και οι θυγατρικοί πίνακες. Το Course_ID 5 παραβιάζει την ακεραιότητα αναφορών.

Συχνές Ερωτήσεις

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

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

Η λειτουργία ON DELETE CASCADE διαγράφει αυτόματα τις αντίστοιχες θυγατρικές σειρές κάθε φορά που διαγράφεται η γονική τους σειρά, διατηρώνταςping οι πίνακες είναι συνεπείς. Εναλλακτικές λύσεις είναι η SET NULL, η οποία διαγράφει το θυγατρικό ξένο κλειδί, και η NO ACTION, η οποία μπλοκάρει τη διαγραφή.

Ναι. Ένα αυτοαναφερόμενο ξένο κλειδί υποδεικνύει ένα πρωτεύον κλειδί στον ίδιο πίνακα, το οποίο μοντελοποιεί ιεραρχίες, όπως μια γραμμή υπαλλήλου που αναφέρεται στον προϊστάμενό του. Για αυτοαναφορές, ο SQL Server συνιστά την επιλογή ON DELETE NO ACTION (ΚΑΜΙΑ ΕΝΕΡΓΕΙΑ ΚΑΤΑ ΤΗ ΔΙΑΔΙΚΑΣΙΑ) για την αποφυγή κύκλων καταρράκτη.

Ναι, εκτός εάν η στήλη έχει δηλωθεί ως NOT NULL. Ένα ξένο κλειδί NULL σημαίνει ότι η θυγατρική γραμμή δεν είναι ακόμη συνδεδεμένη με καμία γονική γραμμή και ο SQL Server παραλείπει τον έλεγχο αναφοράς για αυτήν την τιμή NULL.

Εκτελέστε την εντολή ALTER TABLE child_table DROP CONSTRAINT fkey_name. Πρέπει να δώσετε το όνομα του περιορισμού, το οποίο μπορείτε να βρείτε στο sys.foreign_keys. Dropping Το ξένο κλειδί καταργεί τη σχέση αλλά αφήνει αμετάβλητους και τους δύο πίνακες και τα δεδομένα τους.

Ναί. GitHub Copilot μπορεί να γράψει περιορισμούς FOREIGN KEY μέσα σε εντολές CREATE TABLE ή ALTER TABLE από μια προτροπή φυσικής γλώσσας και να προτείνει τον γονικό πίνακα και τη στήλη αναφοράς. Να ελέγχετε πάντα τα κλειδιά, τις ενέργειες αναφοράς και τους τύπους δεδομένων πριν εκτελέσετε το σενάριο.

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

Συνοψίστε αυτήν την ανάρτηση με: