Primärschlüssel und Fremdschlüssel eingeben SQLite mit Beispielen
⚡ Intelligente Zusammenfassung
Primärschlüssel und Fremdschlüssel in SQLite Die Datenintegrität wird durch die eindeutige Identifizierung jeder Zeile und die Verknüpfung verwandter Tabellen sichergestellt. Dadurch wird gewährleistet, dass referenzierte Werte immer vorhanden sind und doppelte, Null- oder verwaiste Datensätze in einer relationalen Datenbank verhindert werden.

Die folgenden Abschnitte erläutern SQLite Im Detail werden die Einschränkungen erläutert, angefangen bei PRIMARY KEY und FOREIGN KEY, die Tabellen definieren und miteinander verbinden, bis hin zu den Regeln NOT NULL, DEFAULT, UNIQUE und CHECK, die die Daten in jeder Spalte validieren.
SQLite Einschränkungen
Spaltenbeschränkungen legen Regeln für die in eine Spalte eingefügten Werte fest, um die Daten zu validieren. Diese Beschränkungen werden beim Erstellen einer Tabelle innerhalb der Spaltendefinition festgelegt. Sie gewährleisten die Konsistenz und Genauigkeit der gespeicherten Daten, indem sie Werte ablehnen, die gegen die festgelegten Regeln verstoßen, wie z. B. Duplikate, Nullwerte oder Werte, die in einer verknüpften Tabelle nicht vorhanden sind.
SQLite Primärschlüssel
Alle Werte in einer Primärschlüsselspalte müssen eindeutig und dürfen nicht null sein. Der Primärschlüssel identifiziert jede Zeile in der Tabelle eindeutig.
Der Primärschlüssel kann entweder auf eine einzelne Spalte oder auf eine Kombination von Spalten angewendet werden. Im letzteren Fall muss die Kombination der Spaltenwerte für alle Zeilen der Tabelle eindeutig sein.
Syntax:
Es gibt mehrere verschiedene Möglichkeiten, einen Primärschlüssel in einer Tabelle zu definieren:
In der Spaltendefinition selbst:
ColumnName INTEGER NOT NULL PRIMARY KEY;
Als separate Definition:
PRIMARY KEY(ColumnName);
So erstellen Sie eine Spaltenkombination als Primärschlüssel:
PRIMARY KEY(ColumnName1, ColumnName2);
SQLite NOT NULL-, DEFAULT-, UNIQUE- und CHECK-Constraints
Neben dem Primärschlüssel SQLite Es bietet verschiedene Spaltenbeschränkungen, die die in eine Tabelle eingegebenen Werte validieren. Die Beschränkungen NOT NULL, DEFAULT, UNIQUE und CHECK werden jeweils in der Spaltendefinition definiert und erzwingen jeweils eine spezifische Regel für die Spalte. Datentyp und Werte.
NOT NULL-Beschränkung
Das SQLite Die NOT NULL-Einschränkung verhindert, dass eine Spalte einen Nullwert enthält:
ColumnName INTEGER NOT NULL;
DEFAULT-Einschränkung
Mit der SQLite Bei der DEFAULT-Einschränkung wird, wenn kein Wert in eine Spalte eingefügt wird, stattdessen der Standardwert eingefügt.
Beispielsweise:
ColumnName INTEGER DEFAULT 0;
Wenn Sie eine INSERT-Anweisung schreiben und keinen Wert für diese Spalte angeben, hat die Spalte den Wert 0.
EINZIGARTIGE Einschränkung
Das SQLite Die UNIQUE-Einschränkung verhindert doppelte Werte innerhalb der Spalte.
Beispielsweise:
EmployeeId INTEGER NOT NULL UNIQUE;
Dadurch wird sichergestellt, dass der Wert von „EmployeeId“ eindeutig ist; doppelte Werte sind nicht zulässig. Beachten Sie, dass dies nur für die Werte der Spalte „EmployeeId“ gilt.
Prüfbedingung
Das SQLite Die CHECK-Bedingung legt eine Bedingung fest, die einen eingefügten Wert überprüft. Wenn der Wert der Bedingung nicht entspricht, wird er nicht eingefügt.
Quantity INTEGER NOT NULL CHECK(Quantity > 10);
In der Spalte „Menge“ darf kein Wert unter 10 eingegeben werden.
SQLite Unbekannter Schlüssel
Das SQLite Ein Fremdschlüssel ist eine Einschränkung, die überprüft, ob ein Wert aus einer Tabelle auch in einer anderen Tabelle vorhanden ist, die mit der ersten Tabelle, in der der Fremdschlüssel definiert ist, in Beziehung steht.
Bei der Arbeit mit mehreren Tabellen kommt es vor, dass zwei Tabellen über eine gemeinsame Spalte miteinander verknüpft sind. Um sicherzustellen, dass ein in die eine Tabelle eingefügter Wert auch in der Spalte der anderen Tabelle vorhanden sein muss, sollte eine Fremdschlüsselbedingung für die gemeinsame Spalte verwendet werden.
Wenn Sie in diesem Fall versuchen, einen Wert in diese Spalte einzufügen, stellt der Fremdschlüssel sicher, dass der eingefügte Wert in der entsprechenden Spalte der referenzierten Tabelle vorhanden ist.
Beachten Sie, dass Fremdschlüsselbeschränkungen nicht standardmäßig aktiviert sind in SQLiteSie müssen diese zuerst aktivieren, indem Sie folgenden Befehl ausführen:
PRAGMA foreign_keys = ON;
Fremdschlüsseleinschränkungen wurden eingeführt SQLite ab Version 3.6.19.
Beispiel von SQLite Unbekannter Schlüssel
Angenommen, wir haben zwei Tabellen: Studenten und Fachbereiche.
Die Tabelle „Studenten“ enthält eine Liste der Studierenden, und die Tabelle „Fachbereiche“ enthält eine Liste der Fachbereiche. Jeder Student gehört zu einem Fachbereich; das heißt, jeder Student hat eine Spalte „Fachbereichs-ID“.
Nun werden wir sehen, wie die Fremdschlüsselbeschränkung dazu beitragen kann, sicherzustellen, dass der Wert der Abteilungs-ID in der Tabelle „Students“ auch in der Tabelle „Departments“ vorhanden ist.
Wenn wir also eine Fremdschlüsselbeschränkung für die DepartmentId in der Tabelle Students erstellen, muss jede eingefügte departmentId auch in der Tabelle Departments vorhanden sein.
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) );
Um zu überprüfen, wie Fremdschlüsselbeschränkungen verhindern können, dass ein undefiniertes Element oder ein undefinierter Wert in eine Tabelle eingefügt wird, die eine Beziehung zu einer anderen Tabelle hat, werden wir uns das folgende Beispiel ansehen.
In diesem Beispiel besteht eine Fremdschlüsselbeziehung zwischen der Tabelle „Departments“ und der Tabelle „Students“. Daher muss jeder in die Tabelle „Students“ eingefügte Wert für „departmentId“ auch in der Tabelle „Departments“ vorhanden sein. Versucht man, einen nicht vorhandenen Wert für „departmentId“ einzufügen, verhindert die Fremdschlüsselbedingung dies.
Fügen wir nun zwei Abteilungen, „IT“ und „Kunst“, in die Abteilungstabelle ein, und zwar mit folgendem Inhalt: INSERT-Abfragen:
INSERT INTO Departments VALUES(1, 'IT'); INSERT INTO Departments VALUES(2, 'Arts');
Die beiden Anweisungen sollten zwei Abteilungen in die Tabelle „Departments“ einfügen. Sie können überprüfen, ob die beiden Werte eingefügt wurden, indem Sie anschließend die Abfrage „SELECT * FROM Departments“ ausführen:
Versuchen Sie anschließend, einen neuen Studenten mit einer Abteilungs-ID einzufügen, die in der Tabelle „Abteilungen“ nicht existiert:
INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);
Die Zeile wird nicht eingefügt, und Sie erhalten eine Fehlermeldung mit dem Hinweis: FOREIGN KEY-Einschränkung fehlgeschlagen.
Unterschied zwischen Primärschlüssel und Fremdschlüssel in SQLite
Primärschlüssel und Fremdschlüssel tragen beide zur Datenintegrität bei, erfüllen aber unterschiedliche Funktionen. Ein Primärschlüssel identifiziert Zeilen innerhalb einer einzelnen Tabelle, während ein Fremdschlüssel Zeilen aus zwei zusammengehörigen Tabellen verknüpft. Die folgende Tabelle fasst die wichtigsten Unterschiede zusammen.
| Verpflegung | Primärschlüssel | Unbekannter Schlüssel |
|---|---|---|
| Zweck | Identifiziert jede Zeile in ihrer eigenen Tabelle eindeutig. | Bezieht sich auf den Primärschlüssel einer anderen Tabelle, um sie zu verknüpfen. |
| Einzigartigkeit | Die Werte müssen eindeutig sein. | Werte können sich wiederholen, daher können mehrere untergeordnete Zeilen denselben übergeordneten Eintrag haben. |
| Nullwerte | Darf nicht null sein. | Kann null sein, wenn die Beziehung optional ist. |
| Anzahl pro Tisch | Nur ein Primärschlüssel pro Tabelle | Eine Tabelle kann mehrere Fremdschlüssel haben |
| Indizierung | Automatisch indiziert | Wird nicht automatisch indiziert; fügen Sie einen Index hinzu, um die Performance zu verbessern. |
Im Beispiel „Studenten und Fachbereiche“ ist DepartmentId der Primärschlüssel der Tabelle „Fachbereiche“ und ein Fremdschlüssel in der Tabelle „Studenten“. Dadurch wird jeder Student einem gültigen Fachbereich zugeordnet.
SQLite Zusammengesetzter Primärschlüssel
Ein zusammengesetzter Primärschlüssel ist ein Primärschlüssel, der aus zwei oder mehr Spalten besteht. Er wird verwendet, wenn keine einzelne Spalte für sich genommen eindeutig ist, die Kombination der Spalten jedoch für jede Zeile eindeutig ist. SQLite Behandelt die kombinierten Werte als einen Schlüssel.
Eine Anmeldetabelle kann beispielsweise zulassen, dass derselbe Student in mehreren Kursen und derselbe Kurs von mehreren Studenten belegt wird, dennoch sollte jedes Student-Kurs-Paar nur einmal vorkommen:
CREATE TABLE Enrollments ( StudentId INTEGER NOT NULL, CourseId INTEGER NOT NULL, Grade TEXT, PRIMARY KEY (StudentId, CourseId) );
Hier ist weder StudentId noch CourseId allein eindeutig, sondern nur das Paar (StudentId, CourseId). Daher kann derselbe Student nicht zweimal im selben Kurs eingeschrieben sein. Beachten Sie bei der Verwendung eines zusammengesetzten Schlüssels Folgendes:
- Verwenden Sie einen zusammengesetzten Schlüssel, wenn eine einzelne Spalte eine Zeile nicht eindeutig identifizieren kann.
- Jede Spalte im zusammengesetzten Schlüssel folgt den Regeln des Primärschlüssels, daher muss der kombinierte Wert eindeutig und darf nicht null sein.
- Ein zusammengesetzter Schlüssel wird als separate PRIMARY KEY-Klausel auf Tabellenebene geschrieben, nicht innerhalb einer einzelnen Spaltendefinition.
SQLite Aktionen für Fremdschlüssel: BEI LÖSCHEN und BEI AKTUALISIERUNG
Ein Fremdschlüssel kann auch steuern, was mit untergeordneten Zeilen geschieht, wenn die übergeordnete Zeile, auf die er verweist, gelöscht oder aktualisiert wird. Diese referenziellen Aktionen werden mit den Klauseln ON DELETE und ON UPDATE beim Definieren des Fremdschlüssels hinzugefügt. SQLite unterstützt fünf Aktionen:
- KEINE AKTION — die Standardaktion, die einen Fehler auslöst, wenn untergeordnete Zeilen noch auf das übergeordnete Element verweisen.
- BESCHRÄNKEN — verhindert, dass das Löschen oder Aktualisieren sofort erfolgt, bevor irgendeine andere Änderung ausgeführt wird.
- NULL SETZEN — setzt die Spalte mit dem untergeordneten Fremdschlüssel auf NULL.
- STANDARD EINSTELLEN — setzt die Spalte mit dem untergeordneten Fremdschlüssel auf ihren deklarierten Standardwert.
- CASCADE — wendet die gleiche Änderung auf die untergeordneten Zeilen an, sodass beim Löschen eines übergeordneten Elements auch dessen untergeordnete Elemente gelöscht werden.
Das folgende Beispiel erstellt die Tabelle „Studenten“ neu, sodass beim Löschen einer Abteilung automatisch auch die zugehörigen Studenten gelöscht werden und beim Aktualisieren einer Abteilungs-ID die entsprechenden Studenten aktualisiert werden:
CREATE TABLE Students ( StudentId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, StudentName NVARCHAR(50) NULL, DepartmentId INTEGER NOT NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) ON DELETE CASCADE ON UPDATE CASCADE );
Beachten Sie, dass referenzielle Aktionen nur ausgeführt werden, wenn die Unterstützung für Fremdschlüssel aktiviert ist. Führen Sie daher zu Beginn jeder Verbindung `PRAGMA foreign_keys = ON` aus. Andernfalls… SQLite Analysiert die ON DELETE- und ON UPDATE-Klauseln, erzwingt sie aber nicht.


