Κύριο κλειδί και Ξένο κλειδί in SQLite με παραδείγματα

SQLite Περιορισμοί

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

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

Όλες οι τιμές σε μια στήλη πρωτεύοντος κλειδιού πρέπει να είναι μοναδικές και όχι μηδενικές

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

Σύνταξη:

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

  • Στον ίδιο τον ορισμό της στήλης:
    ColumnName INTEGER NOT NULL PRIMARY KEY;
  • Ως ξεχωριστός ορισμός:
    PRIMARY KEY(ColumnName);
  • Για να δημιουργήσετε έναν συνδυασμό στηλών ως πρωτεύον κλειδί:
    PRIMARY KEY(ColumnName1, ColumnName2);

Όχι μηδενικός περιορισμός

SQLite Ο μη μηδενικός περιορισμός εμποδίζει μια στήλη να έχει μηδενική τιμή:

ColumnName INTEGER  NOT NULL;

Προεπιλεγμένος περιορισμός

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

Για παράδειγμα:

ColumnName INTEGER DEFAULT 0;

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

SQLite Μοναδικός περιορισμός

SQLite Ο μοναδικός περιορισμός θα αποτρέψει τις διπλές τιμές μεταξύ όλων των τιμών της στήλης.

Για παράδειγμα:

EmployeeId INTEGER NOT NULL UNIQUE;

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

SQLite ΕΛΕΓΧΟΣ περιορισμού

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

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

Δεν μπορείτε να εισαγάγετε μια τιμή μικρότερη από 10 στο "Ποσότητα" στήλη.

SQLite Ξένο κλειδί

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

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

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

Σημειώστε ότι οι περιορισμοί ξένων κλειδιών δεν είναι ενεργοποιημένοι από προεπιλογή SQLite, πρέπει να τα ενεργοποιήσετε πρώτα εκτελώντας την ακόλουθη εντολή:

PRAGMA foreign_keys = ON;

Εισήχθησαν περιορισμοί εξωτερικού κλειδιού SQLite ξεκινώντας από την έκδοση 3.6.19.

Παράδειγμα SQLite Ξένο κλειδί

Ας υποθέσουμε ότι έχουμε δύο πίνακες. Φοιτητές και Τμήματα.

Ο πίνακας Μαθητές έχει μια λίστα μαθητών και ο πίνακας τμημάτων έχει μια λίστα με τα τμήματα. Κάθε μαθητής ανήκει σε ένα τμήμα. Δηλαδή, κάθε μαθητής έχει μια στήλη Id τμήματος.

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

SQLite Ξένο κλειδί

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

CREATE TABLE [Departments] (
	[DepartmentId] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
	[DepartmentName] NVARCHAR(50)  NULL
);
CREATE TABLE [Students] (
	[StudentId] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
	[StudentName] NVARCHAR(50)  NULL,
	[DepartmentId] INTEGER  NOT NULL,
	[DateOfBirth] DATE  NULL,
	FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId)
);

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

Σε αυτό το παράδειγμα, ο πίνακας Τμήματα έχει έναν περιορισμό κλειδιού ξένου στον πίνακα Students, επομένως οποιαδήποτε τιμή DepartmentId που έχει εισαχθεί στον πίνακα Students πρέπει να υπάρχει στον πίνακα τμήματα. Εάν προσπαθήσετε να εισαγάγετε μια τιμή DepartmentId που δεν υπάρχει στον πίνακα τμήματα, ο περιορισμός του ξένου κλειδιού θα σας εμπόδιζε να το κάνετε αυτό.

Ας εισάγουμε δύο τμήματα "ΤΟ" και «Τέχνες» στον πίνακα των τμημάτων ως εξής:

INSERT INTO Departments VALUES(1, 'IT');
INSERT INTO Departments VALUES(2, 'Arts');

Οι δύο δηλώσεις πρέπει να εισάγουν δύο τμήματα στον πίνακα τμημάτων, μπορείτε να διασφαλίσετε ότι οι δύο τιμές εισήχθησαν εκτελώντας το ερώτημα “ΕΠΙΛΟΓΗ * ΑΠΟ ΤΜΗΜΑΤΑ” μετά από αυτό:

SQLite Ξένο κλειδί

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

INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);

Η σειρά δεν θα εισαχθεί και θα λάβετε ένα σφάλμα που λέει ότι: Ο περιορισμός FOREIGN KEY απέτυχε.