Problem:
Sie möchten einen Fremdschlüssel für eine Tabelle in einer Datenbank erstellen.
Beispiel:
Wir möchten eine Tabelle mit dem Namen student
die einen Fremdschlüssel enthält, der auf die id
verweist Spalte in der Tabelle city
.
Lösung 1 (neue Tabelle):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT FOREIGN KEY REFERENCES city(id) );
Diskussion:
Um eine neue Tabelle zu erstellen, die eine Fremdschlüsselspalte enthält, die auf eine andere Tabelle verweist, verwenden Sie das Schlüsselwort FOREIGN KEY REFERENCES
am Ende der Definition dieser Spalte. Darauf folgen der Name der referenzierten Tabelle und der Name der referenzierten Spalte in Klammern.
In unserem Beispiel erstellen wir die Tabelle student
mit einem CREATE TABLE
Klausel. Wir listen die Namen der Spalten auf und setzen ihre jeweiligen Datentypen in Klammern. Die Spalte city_id
ist der Fremdschlüssel in dieser Tabelle und gibt den Wert der ID an, die in der Spalte id
gespeichert ist in der Tabelle city
. Wir schreiben FOREIGN KEY REFERENCES
am Ende der Definition dieser Spalte und folgen Sie ihr mit der referenzierten Tabelle und Spalte:city(id)
.
Denken Sie daran, dass Sie mehr als einen Fremdschlüssel für eine Tabelle erstellen können.
Lösung 2 (neue Tabelle):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, FOREIGN KEY (city_id) REFERENCES city(id) );
Diskussion:
Eine andere Möglichkeit, einen Fremdschlüssel während der Tabellenerstellung zu definieren, ist die Verwendung der FOREIGN KEY REFERENCES
-Klausel am Ende der Spaltendefinitionen. In diesem Fall nach dem FOREIGN KEY
-Klausel bezeichnen wir die Fremdschlüsselspalte. Als nächstes kommen die REFERENCES
-Klausel zusammen mit dem Namen der referenzierten Tabelle und Spalte.
Sie können Fremdschlüssel für mehr als eine Spalte erstellen, wie unten gezeigt:
Lösung 3 (neue Tabelle):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, score_id INT, subject_id INT, CONSTRAINT fk_student_score_subject_id FOREIGN KEY (subject_id, score_id) REFERENCES score_subject(subject_id, score_id) );
In diesem Beispiel die Einschränkung fk_student_score_subject_id
ist ein Fremdschlüssel, der aus zwei Spalten besteht:score_id
und subject_id
. Diese beiden Fremdschlüsselspalten beziehen sich auf zwei Spalten in der Tabelle score_subject
– score_id
und subject_id
.
Hier ist ein weiteres Beispiel:
Lösung 4 (neue Tabelle):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id) );
Diskussion:
In diesem Code haben wir wieder die CONSTRAINT
-Klausel mit dem Namen dieser Einschränkung. Verwenden Sie Namen, die leicht zu lesen und zu verstehen sind. In unserem Beispiel verwenden wir den Namen fk_student_city_id
, das die relevante Tabelle und Spalte angibt. Als nächstes schreiben wir FOREIGN KEY
und fügen Sie (in Klammern) den Namen der Spalte hinzu, die zum Fremdschlüssel wird. Dann haben wir die REFERENCES
-Klausel gefolgt vom Namen der referenzierten Tabelle und Spalte (hier:id
).
Lösung 5 (vorhandene Tabelle):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Diskussion:
Es ist auch möglich, einer bestehenden Tabelle einen neuen Fremdschlüssel hinzuzufügen. Hier wird die Tabelle mit einem ALTER TABLE
verändert Klausel. Der Tabellenname (in unserem Beispiel student
) wird nach ALTER TABLE
platziert Stichwort. Als nächstes der ADD FOREIGN KEY
-Klausel folgt der Name der Spalte, die als Fremdschlüssel verwendet wird. Dann haben wir die REFERENCES clause
mit dem Namen der referenzierten Tabelle und dem Namen der Primärschlüsselspalte in Klammern.
Beachten Sie, dass die Tabelle, die Sie ändern, vorhanden sein muss, bevor dieser Befehl ausgeführt wird.
Lösung 6 (vorhandene Tabelle, Fremdschlüsselbeschränkung):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Diskussion:
Verwenden Sie eine Abfrage wie diese, wenn Sie eine Fremdschlüsselspalte als Einschränkung für eine vorhandene Tabelle benennen möchten. Hier heißt die Fremdschlüsseleinschränkung fk_student_city_id
. Wenn Sie den Constraint-Namen nicht angeben, generiert die Datenbank einen Standard-Constraint-Namen (der je nach Datenbank unterschiedlich ist).