Verständnis von Fremdschlüsseln in SQL Server

Bei der Gestaltung einer relationalen Datenbank ist es wichtig, Beziehungen zwischen Tabellen herzustellen, um die Datenintegrität aufrechtzuerhalten. Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Fremdschlüsseln. Ein Fremdschlüssel in SQL Server ist ein Feld (oder eine Sammlung von Feldern) in einer Tabelle, das eine Zeile in einer anderen Tabelle eindeutig identifiziert. Wenn Sie von einem anderen Datenbanksystem, wie z.B. PostgreSQL, kommen, könnten Sie einige Unterschiede in der Syntax und Implementierung in SQL Server feststellen, die zu Verwirrung führen können.

Das Problem: Einen Fremdschlüssel erstellen

Im gegebenen Szenario gibt es den Versuch, drei Tabellen zu erstellen: exams, question_bank und answer_bank. Das Ziel ist es, einen Fremdschlüssel in question_bank zu erstellen, der auf die Tabelle exams verweist. Es tritt jedoch ein Fehler auf, wenn der SQL-Code ausgeführt wird. Die Hauptbotschaft aus dem Fehler lautet:

Msg 8139, Level 16, State 0, Line 9 Anzahl der referenzierenden Spalten im Fremdschlüssel unterscheidet sich von der Anzahl der referenzierten Spalten, Tabelle ‘question_bank’.

Dies deutet darauf hin, dass es eine Fehlanpassung in der Definition des Fremdschlüssels gibt.

Lösung: Den Fremdschlüssel korrekt definieren

Schritt 1: Überprüfen der Tabellendefinitionen

Schauen wir uns näher an, wie der Fremdschlüssel in der Tabelle question_bank korrekt eingerichtet werden kann.

Aktuelle Tabelleneinrichtung

Der ursprüngliche SQL-Befehl hat die Tabelle question_bank wie folgt erstellt:

create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id foreign key references exams(exam_id)
);

Der Fremdschlüssel soll auf exam_id aus der Tabelle exams verweisen, aber es fehlt die entsprechende Syntax und Struktur.

Schritt 2: Die Definition des Fremdschlüssels aktualisieren

Um die Fremdschlüsselbeziehung korrekt zu definieren, geben Sie an, wie die Fremdschlüsselspalte (question_exam_id) sich auf den Primärschlüssel der referenzierten Tabelle (exam_id) bezieht:

create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);

Wichtige Änderungen:

  • Fremdschlüsselnamen angeben: Es ist eine gute Praxis, die Fremdschlüsselbeschränkung (z.B. fk_questionbank_exams) zur Klarheit zu benennen.
  • Fremdschlüsselspalte korrekt referenzieren: Stellen Sie sicher, dass der Fremdschlüssel die richtige Spalte in der referenzierten Tabelle referenziert.

Schritt 3: Die Änderungen umsetzen

Nun können Sie die vorhandene Tabelle question_bank (falls sie existiert) löschen und sie erneut mit der korrigierten Fremdschlüsseldefinition erstellen:

drop table if exists question_bank;

create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);

Fazit

Die Einrichtung von Fremdschlüsseln in SQL Server ist ein wichtiger Schritt zur Sicherstellung der Datenintegrität und zur Herstellung von Beziehungen zwischen Tabellen. Durch die sorgfältige Definition der Fremdschlüsselbeschränkungen und die Behebung von Syntaxproblemen können Sie ein robustes und effizientes Datenbankdesign erstellen.

Wenn Sie auf Fehler stoßen, überprüfen Sie immer die Definitionen der Fremdschlüssel, um sicherzustellen, dass die referenzierende Spalte korrekt mit der referenzierten Spalte übereinstimmt. Mit diesem Leitfaden sollten Sie gut gerüstet sein, um Fremdschlüssel erfolgreich in Ihren SQL Server-Datenbanken zu implementieren.