SQL Server-Fremdschlüssel: Erstellung anhand eines Beispiels

⚡ Intelligente Zusammenfassung

Ein Fremdschlüssel in SQL Server gewährleistet die referenzielle Integrität, indem er eine Kindtabelle mit einer Elterntabelle verknüpft. Jeder Fremdschlüsselwert muss bereits im referenzierten Primärschlüssel der Elterntabelle vorhanden sein.

  • 🔗 Was ist ein Fremdschlüssel? Ein Fremdschlüssel verknüpft eine Kindtabelle mit einer Elterntabelle und gewährleistet die referenzielle Integrität zwischen ihnen.
  • 👪 Eltern und Kind: Die referenzierte Tabelle ist die übergeordnete Tabelle; die Tabelle, die den Fremdschlüssel enthält, ist die untergeordnete Tabelle, die auf den Primärschlüssel der übergeordneten Tabelle verweist.
  • 🖱️ Zwei Erstellungsmethoden: Sowohl die Beziehungen in SQL Server Management Studio als auch die T-SQL-Klausel CREATE TABLE … FOREIGN KEY … REFERENCES definieren einen Fremdschlüssel.
  • Zu einer bestehenden Tabelle hinzufügen: ALTER TABLE … ADD CONSTRAINT … FOREIGN KEY fügt die Beziehung zu einer bereits existierenden Tabelle hinzu.
  • 🔄 Referenzaktionen: Die Klauseln ON DELETE und ON UPDATE steuern untergeordnete Zeilen mit NO ACTION, CASCADE, SET NULL oder SET DEFAULT.
  • Integrity überprüfen: Das Einfügen einer Kindzeile, deren Schlüssel keiner übergeordneten Zeile entspricht, wird abgelehnt.ping die Daten sind konsistent.

SQL Server-Fremdschlüssel: Erstellung in SQL Server anhand eines Beispiels

Was ist ein Fremdschlüssel?

Ein Fremdschlüssel bietet eine Möglichkeit, die referenzielle Integrität innerhalb von SQL ServerVereinfacht ausgedrückt stellt ein Fremdschlüssel sicher, dass Werte aus einer Tabelle auch in einer anderen Tabelle vorhanden sein müssen.

Regeln für FOREIGN KEY

  • NULL ist in einem SQL-Fremdschlüssel zulässig.
  • Die Tabelle, auf die verwiesen wird, heißt übergeordnete Tabelle.
  • Die Tabelle mit dem Fremdschlüssel wird als Kindtabelle bezeichnet.
  • Der Fremdschlüssel in der Kindtabelle verweist auf die Primärschlüssel in der übergeordneten Tabelle.
  • Diese Eltern-Kind-Beziehung gewährleistet die Einhaltung der Regel der „referenziellen Integrität“.

Das folgende Diagramm fasst alle oben genannten Punkte zum Thema Fremdschlüssel zusammen.

Diagramm eines Fremdschlüssels, der eine Kindtabelle mit dem Primärschlüssel der Elterntabelle verknüpft

So erstellen Sie einen Fremdschlüssel in SQL

In SQL Server gibt es zwei Möglichkeiten, einen Fremdschlüssel zu erstellen:

SQL Server Management Studio

Übergeordnete Tabelle: Angenommen, wir haben eine bestehende übergeordnete Tabelle namens 'Course'. Course_ID und Course_name sind zwei Spalten, wobei Course_Id der Primärschlüssel ist.

Übergeordnete Tabelle „Kurs“ mit den Spalten „Course_Id“ (Primärschlüssel) und „Course_name“

Kindtabelle: Die zweite Tabelle muss als Kindtabelle erstellt werden. Ihre beiden Spalten sind „Course_ID“ und „Course_Strength“. „Course_ID“ soll der Fremdschlüssel sein.

Schritt 1) ​​Klicken Sie mit der rechten Maustaste auf Tabellen > Neu > Tabelle…

Klicken Sie mit der rechten Maustaste auf Tabellen, dann auf Neu und anschließend auf Tabelle in SQL Server Management Studio.

Schritt 2) Geben Sie zwei Spaltennamen wie „Course_ID“ und „Course_Strength“ ein. Klicken Sie mit der rechten Maustaste auf die Spalte „Course_Id“ und klicken Sie dann auf „Beziehung“.

Neue Spalten für die untergeordnete Tabelle „Course_ID“ und „Course_Strength“ mit dem Menü „Beziehungen“

Schritt 3) Klicken Sie unter „Fremdschlüsselbeziehungen“ auf „Hinzufügen“.

Dialogfeld „Fremdschlüsselbeziehungen“ mit der Schaltfläche „Hinzufügen“

Schritt 4) Klicken Sie in der „Tabellen- und Spaltenspezifikation“ auf das Symbol „…“.

Spezifikationsfeld für Tabellen und Spalten mit der Auslassungspunkte-Schaltfläche

Schritt 5) Wählen Sie in der Dropdown-Liste die 'Primärschlüsseltabelle' als 'COURSE' und die neu zu erstellende Tabelle als 'Fremdschlüsseltabelle' aus.

Auswahl von COURSE als Primärschlüsseltabelle im Beziehungsdialog

Schritt 6) Wählen Sie für die 'Primärschlüsseltabelle' die Spalte 'Course_Id' als Primärschlüsselspalte aus.

Wählen Sie für die „Fremdschlüsseltabelle“ die Spalte „Course_Id“ als Fremdschlüsselspalte aus. Klicken Sie auf OK.

Karteping Course_Id als Primärschlüssel- und Fremdschlüsselspalte

Schritt 7) Klicken Sie auf Hinzufügen.

Durch Klicken auf „Hinzufügen“ wird die Fremdschlüsselbeziehung bestätigt.

Schritt 8) Geben Sie als Tabellennamen „Course_Strength“ ein und klicken Sie auf OK.

Benennen Sie die untergeordnete Tabelle „Course_Strength“ und klicken Sie auf OK.

Ergebnis: Wir haben eine Eltern-Kind-Beziehung zwischen „Kurs“ und „Kursstärke“ hergestellt.

Es wurde eine Eltern-Kind-Beziehung zwischen Kurs und Kursstärke hergestellt.

T-SQL: Erstellen einer Eltern-Kind-Tabelle mit T-SQL

Übergeordnete Tabelle: Wir gehen davon aus, dass wir eine bestehende übergeordnete Tabelle mit dem Namen 'Kurs' haben. Kurs_ID und Kurs_Name sind zwei Spalten, wobei Kurs_ID der Primärschlüssel ist.

Vorhandene übergeordnete Tabelle „Course“ mit „Course_Id“ als Primärschlüssel

Kindtabelle: Wir müssen eine zweite Tabelle als Kindtabelle mit dem Namen „Course_Strength_TSQL“ erstellen. Ihre beiden Spalten sind „Course_ID“ und „Course_Strength“. Die Spalte „Course_ID“ soll der Fremdschlüssel sein.

Nachfolgend finden Sie die Syntax für eine Tabelle erstellen mit einem Fremdschlüssel.

Syntax:

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 } ] 
);

Hier ist eine Beschreibung der oben genannten Parameter:

  • childTable ist der Name der Tabelle, die erstellt werden soll.
  • column_1 und column_2 sind die Spalten, die der Tabelle hinzugefügt werden sollen.
  • fkey_name ist der Name der zu erstellenden Fremdschlüsselbeschränkung.
  • child_column1, child_column2 … child_column_n sind die Spalten der Kindtabelle, die auf den Primärschlüssel in der Elterntabelle verweisen.
  • parentTable ist der Name der übergeordneten Tabelle, deren Schlüssel in der untergeordneten Tabelle referenziert wird.
  • parent_column1, parent_column2 … parent_column_n sind die Spalten, die den Primärschlüssel der übergeordneten Tabelle bilden.
  • ON DELETE ist ein optionaler Parameter, der festlegt, was mit den untergeordneten Daten nach dem Löschen der übergeordneten Daten geschieht. Mögliche Werte sind NO ACTION, SET NULL, CASCADE oder SET DEFAULT.
  • ON UPDATE ist ein optionaler Parameter, der festlegt, was mit den untergeordneten Daten nach der Aktualisierung der übergeordneten Daten geschieht. Mögliche Werte sind NO ACTION, SET NULL, CASCADE oder SET DEFAULT.
  • KEINE AKTION bedeutet, dass mit den untergeordneten Daten nichts geschieht, nachdem die übergeordneten Daten aktualisiert oder gelöscht wurden.
  • CASCADE bedeutet, dass die Kinddaten erst gelöscht oder aktualisiert werden, nachdem die Elterndaten gelöscht oder aktualisiert wurden.
  • SET NULL bedeutet, dass die Kinddaten auf null gesetzt werden, nachdem die Elterndaten aktualisiert oder gelöscht wurden.
  • SET DEFAULT bedeutet, dass die untergeordneten Daten nach einer Aktualisierung oder Löschung der übergeordneten Daten auf ihren Standardwert zurückgesetzt werden.

Betrachten wir ein Beispiel für einen Fremdschlüssel, der eine Tabelle mit einer Spalte als Fremdschlüssel erstellt, mithilfe eines Datentyp für jede Spalte.

Beispiel für einen Fremdschlüssel in SQL

Abfrage:

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

Schritt 1) ​​Führen Sie die Abfrage durch, indem Sie auf Ausführen klicken.

Die CREATE TABLE-Abfrage, die den Fremdschlüssel Course_ID definiert, wird ausgeführt.

Ergebnis: Wir haben eine Eltern-Kind-Beziehung zwischen 'Course' und 'Course_Strength_TSQL' hergestellt.

Es wurde eine Eltern-Kind-Beziehung zwischen Kurs und Kursstärke_TSQL erstellt.

Verwenden von ALTER TABLE

Nun lernen wir, wie man in SQL Server mithilfe der ALTER TABLE-Anweisung einen Fremdschlüssel zu einer bereits existierenden Tabelle hinzufügt. Wir verwenden dazu die unten angegebene Syntax:

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);

Hier ist eine Beschreibung der oben verwendeten Parameter:

  • childTable ist der Name der Tabelle, die erstellt werden soll.
  • column_1 und column_2 sind die Spalten, die der Tabelle hinzugefügt werden sollen.
  • fkey_name ist der Name der zu erstellenden Fremdschlüsselbeschränkung.
  • child_column1, child_column2 … child_column_n sind die Spalten der Kindtabelle, die auf den Primärschlüssel in der Elterntabelle verweisen.
  • parentTable ist der Name der übergeordneten Tabelle, deren Schlüssel in der untergeordneten Tabelle referenziert wird.
  • parent_column1, parent_column2 … parent_column_n sind die Spalten, die den Primärschlüssel der übergeordneten Tabelle bilden.

ALTER TABLE Beispiel zum Hinzufügen eines Fremdschlüssels:

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

Wir haben einen Fremdschlüssel namens fkey_student_admission für die Abteilungstabelle erstellt. Dieser Fremdschlüssel verweist auf die Zulassungsspalte der Studententabelle.

Beispielabfrage FOREIGN KEY

Schauen wir uns zunächst die Daten unserer übergeordneten Tabelle an, COURSE.

Abfrage:

SELECT * from COURSE;

SELECT-Ergebnis, das die Daten der übergeordneten Tabelle COURSE anzeigt

Nun fügen wir einige Zeilen in die untergeordnete Tabelle 'Course_Strength_TSQL' ein. Wir werden versuchen, zwei Arten von Zeilen einzufügen:

  • Der erste Typ, bei dem Course_Id in der Kindtabelle in Course_Id der Elterntabelle vorhanden ist, d.h. Course_Id = 1 und 2.
  • Der zweite Typ ist derjenige, bei dem die Course_Id in der Kindtabelle nicht in der Course_Id der Elterntabelle existiert, d. h. Course_Id = 5.

Abfrage:

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

Einfügen von Kindzeilen, einschließlich der Kurs-ID 5, die keinem übergeordneten Eintrag zugeordnet ist

Ergebnis: Lassen Sie uns die Abfrage gemeinsam ausführen, um unsere übergeordneten und untergeordneten Tabellen anzuzeigen.

Die Zeilen mit den Kurs-IDs 1 und 2 existieren in der Tabelle „Kursstärke“. Kurs-ID 5 stellt jedoch eine Ausnahme dar, da es keine entsprechende Zeile in der übergeordneten Tabelle gibt.

Vergleich der über- und untergeordneten Tabellen; Kurs-ID 5 verletzt die referenzielle Integrität.

Häufig gestellte Fragen

Ein Primärschlüssel identifiziert jede Zeile innerhalb ihrer eigenen Tabelle eindeutig und darf nicht NULL sein. Ein Fremdschlüssel verweist auf diesen Primärschlüssel aus einer anderen Tabelle, um die referenzielle Integrität zu gewährleisten. Primärschlüssel versus Fremdschlüssel Der Vergleich erklärt jeden Unterschied.

Ja. Ein Fremdschlüssel kann entweder auf einen Primärschlüssel oder auf eine beliebige Spalte mit einer UNIQUE-Einschränkung in der übergeordneten Tabelle verweisen. Die referenzierte Spalte muss eindeutige Werte enthalten, sodass jede untergeordnete Zeile genau einer übergeordneten Zeile entspricht.

ON DELETE CASCADE löscht automatisch die entsprechenden untergeordneten Zeilen, sobald deren übergeordnete Zeile gelöscht wird.ping Die Tabellen müssen konsistent sein. Alternativ kann SET NULL verwendet werden, wodurch der Fremdschlüssel des untergeordneten Elements gelöscht wird, oder NO ACTION, wodurch das Löschen verhindert wird.

Ja. Ein selbstbezüglicher Fremdschlüssel verweist auf einen Primärschlüssel in derselben Tabelle und bildet so Hierarchien ab, beispielsweise die Zuordnung eines Mitarbeiters zu seinem Vorgesetzten. SQL Server empfiehlt für Selbstbezüge die Verwendung von ON DELETE NO ACTION, um Kaskadenzyklen zu vermeiden.

Ja, es sei denn, die Spalte ist als NOT NULL deklariert. Ein NULL-Fremdschlüssel bedeutet, dass die untergeordnete Zeile noch keiner übergeordneten Zeile zugeordnet ist, und SQL Server überspringt die referenzielle Prüfung für diesen NULL-Wert.

Führen Sie den Befehl ALTER TABLE child_table DROP CONSTRAINT fkey_name aus. Sie müssen den Namen der Einschränkung angeben, den Sie in sys.foreign_keys finden.ping Der Fremdschlüssel entfernt die Beziehung, lässt aber beide Tabellen und deren Daten unverändert.

Ja. GitHub-Copilot Sie können FOREIGN KEY-Constraints in CREATE TABLE- oder ALTER TABLE-Anweisungen über eine natürlichsprachliche Eingabeaufforderung schreiben und sich die übergeordnete Tabelle und die referenzierte Spalte vorschlagen lassen. Überprüfen Sie vor der Ausführung des Skripts stets die Schlüssel, referenziellen Aktionen und Datentypen.

KI- und Machine-Learning-Tools analysieren Beispieldaten und Abfragemuster, um vorzuschlagen, welche Spalten als Fremdschlüssel verwendet werden sollen, fehlende oder verwaiste Beziehungen zu erkennen und geeignete Aktionen beim Löschen (ON DELETE) zu empfehlen. Der Entwickler prüft jeden Vorschlag, bevor er ihn anwendet.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: