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.

  • 🔑 Primärschlüssel: Ein Primärschlüssel identifiziert jede Zeile eindeutig, und seine Werte müssen eindeutig und dürfen niemals null sein.
  • 🧩 Zusammengesetzter Schlüssel: Die Kombination von zwei oder mehr Spalten bildet einen zusammengesetzten Primärschlüssel, wenn keine einzelne Spalte eindeutig ist.
  • 🔗 Unbekannter Schlüssel: Ein Fremdschlüssel verweist auf einen Schlüssel der übergeordneten Tabelle und gewährleistet die referenzielle Integrität zwischen verknüpften Tabellen.
  • ⚙️ Durchsetzung aktivieren: SQLite Fremdschlüssel sind standardmäßig deaktiviert. Um sie zu aktivieren, führen Sie PRAGMA foreign_keys = ON aus.
  • 🧱 Spaltenbeschränkungen: Die Regeln NOT NULL, DEFAULT, UNIQUE und CHECK prüfen Werte, bevor diese in eine Spalte eingefügt werden.
  • 🤖 KI-Unterstützung: KI-Text-zu-SQL-Assistenten und GitHub Copilot generieren Schlüssel- und Constraint-SQL aus einfachem Englisch.

Primärschlüssel und Fremdschlüssel eingeben SQLite

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:

SELECT-Abfrageergebnis, das die IT- und Kunstabteilungen anzeigt in SQLite

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.

SQLite Fehlermeldung: 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.

Häufig gestellte Fragen

Ja. Wenn eine einzelne Spalte exakt als INTEGER PRIMARY KEY deklariert wird, wird sie zu einem Alias ​​für die in der Tabelle integrierte rowid. SQLite Es wird kein separater Index dafür geführt, sodass Suchvorgänge über diesen Schlüssel schnell sind und keinen zusätzlichen Speicherplatz benötigen.

Die Durchsetzung von Fremdschlüsseln ist standardmäßig deaktiviert, um die Abwärtskompatibilität mit älteren Datenbanken und Skripten, die vor Version 3.6.19 geschrieben wurden, zu gewährleisten. Jede Datenbankverbindung muss vor dem Ausführen von `PRAGMA foreign_keys = ON` konfiguriert werden. SQLite beginnt mit der Überprüfung der Fremdschlüsselbeschränkungen.

SQLite Primärschlüssel und UNIQUE-Spalten werden automatisch indiziert, Fremdschlüsselspalten jedoch nicht. Da die untergeordnete Spalte bei jeder Integritätsprüfung gelesen wird, empfiehlt es sich aus Performancegründen, für jede Fremdschlüsselspalte einen eigenen Index zu erstellen.

Nr. ALTER TABLE in SQLite Einer bestehenden Tabelle kann kein Primärschlüssel oder Fremdschlüssel hinzugefügt werden. Sie benennen die alte Tabelle um, erstellen eine neue Tabelle mit dem definierten Schlüssel, kopieren die Zeilen mit INSERT SELECT und löschen anschließend die alte Tabelle.

Ein einfacher INTEGER-PRIMARY-KEY weist die nächste ID als diejenige über der größten vorhandenen Rowid zu und kann IDs nach Löschungen wiederverwenden. AUTOINCREMENT tracks ist die höchste jemals in sqlite_sequence verwendete ID und verwendet niemals einen Wert wieder, bei einem geringen Leistungsverlust.

Dieser Fehler tritt auf, wenn Sie eine untergeordnete Zeile einfügen oder aktualisieren, deren Fremdschlüsselwert in der übergeordneten Tabelle keiner entsprechenden Zeile entspricht, oder wenn Sie eine übergeordnete Zeile löschen, die noch untergeordnete Zeilen enthält. Fügen Sie zuerst den übergeordneten Datensatz ein.

Ja. KI-gestützte Text-zu-SQL-Assistenten wandeln eine Beschreibung Ihrer Tabellen in natürlicher Sprache in CREATE TABLE-Anweisungen mit PRIMARY KEY- und FOREIGN KEY-Klauseln um. Die Angabe des bestehenden Schemas verbessert die Genauigkeit, und der generierte SQL-Code sollte vor der Ausführung mit echten Daten stets überprüft werden.

Ja. GitHub-Copilot schlägt vor, CREATE TABLE-Code mit PRIMARY KEY, FOREIGN KEY und anderen Einschränkungen direkt in Editoren wie z. B. VS CodeEs liest Ihr bestehendes Schema und Ihre Migrationen, sodass bei den Vervollständigungen Ihre tatsächlichen Tabellen- und Spaltennamen wiederverwendet werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: