In diesem Artikel zeige ich, wie Sie mit Transact-SQL einen Fremdschlüssel in SQL Server erstellen. Ich demonstriere, wie man einen Fremdschlüssel beim Erstellen der Tabelle erstellt (im Gegensatz zum Aktualisieren einer vorhandenen Tabelle).
Ein Fremdschlüssel ist eine Spalte, die auf die Primärschlüsselspalte einer anderen Tabelle verweist. Dadurch wird eine Beziehung zwischen den Tabellen hergestellt.
Beispiel 1 – Vorbereitung
In diesem Beispiel erstelle ich eine Testdatenbank mit einer Tabelle. Diese Tabelle enthält den Primärschlüssel, auf den unser Fremdschlüssel verweist.
Erstellen Sie die Datenbank:
CREATE DATABASE FK_Test;
Erstellen Sie nun die Primärschlüsseltabelle:
USE FK_Test; CREATE TABLE Country ( CountryId int IDENTITY (1,1) NOT NULL PRIMARY KEY, CountryName nvarchar(60) );
Beispiel 2 – Erstellen Sie den Fremdschlüssel
Nachdem wir nun eine Tabelle mit einem Primärschlüssel haben, erstellen wir eine weitere Tabelle mit einem Fremdschlüssel, der auf diesen Primärschlüssel verweist.
CREATE TABLE City ( CityId int IDENTITY (1,1) NOT NULL PRIMARY KEY, CountryId int NOT NULL REFERENCES Country(CountryId), CityName nvarchar(60) );
Dies ist die einfachste Möglichkeit, einen Fremdschlüssel zu erstellen. Wir fügen lediglich die REFERENCES
hinzu -Klausel (zusammen mit der Primärschlüsseltabelle und -spalte) in die Spalte mit der Fremdschlüsseleinschränkung.
Um es klar zu sagen, der Teil, der den Fremdschlüssel definiert, ist dieser:
REFERENCES Country(CountryId)
Dies ist in der Spaltendefinition enthalten und gibt einfach an, dass diese Spalte auf die CountryId
verweist Spalte im Country
Tabelle.
In diesem Fall haben sowohl der Fremdschlüssel als auch der Primärschlüssel, auf den er verweist, denselben Namen (CountryId
). Dies ist jedoch keine Voraussetzung – Ihre Fremdschlüsselspalte kann einen völlig anderen Namen haben als die Spalte, auf die sie verweist (obwohl alle an einer Fremdschlüsselbeziehung beteiligten Spalten mit derselben Länge und Skalierung definiert werden müssen).
Dieses Beispiel bewirkt, dass SQL Server den Namen des Fremdschlüssels automatisch generiert. Das liegt daran, dass ich keinen Namen angegeben habe. Lesen Sie weiter, um zu sehen, wie Sie einen Namen für Ihren Fremdschlüssel erstellen können.
Aber lassen Sie uns zuerst die soeben erstellte Fremdschlüsselbeschränkung überprüfen.
Beispiel 3 – Überprüfung der Fremdschlüsselbeschränkung
Es gibt viele Möglichkeiten, einen Fremdschlüssel mit T-SQL zurückzugeben, und hier ist eine davon:
EXEC sp_fkeys @fktable_name = City;
Ergebnis (bei vertikaler Ausgabe):
PKTABLE_QUALIFIER | FK_Test PKTABLE_OWNER | dbo PKTABLE_NAME | Country PKCOLUMN_NAME | CountryId FKTABLE_QUALIFIER | FK_Test FKTABLE_OWNER | dbo FKTABLE_NAME | City FKCOLUMN_NAME | CountryId KEY_SEQ | 1 UPDATE_RULE | 1 DELETE_RULE | 1 FK_NAME | FK__City__CountryId__38996AB5 PK_NAME | PK__Country__10D1609FC8BFA7F2 DEFERRABILITY | 7
Die sp_fkeys
Die gespeicherte Systemprozedur gibt Informationen über unseren Fremdschlüssel, den zugehörigen Primärschlüssel und andere relevante Details zurück. Sie übergeben einfach den Namen der Fremdschlüsseltabelle oder der Primärschlüsseltabelle und die entsprechenden Informationen werden zurückgegeben.
In diesem Beispiel übergebe ich den Namen der Fremdschlüsseltabelle – City
. In den Ergebnissen können wir uns den
FK_NAME
ansehen Spalte, um zu sehen, dass diese Tabelle eine Fremdschlüsseleinschränkung namens
FK__City__CountryId__38996AB5
hat . Dies ist die, die wir gerade erstellt haben.
Nun, da wir den Fremdschlüssel erstellt haben, wann immer wir versuchen, einen Wert in City.CountryId
einzufügen oder zu aktualisieren -Spalte, die Fremdschlüsseleinschränkung lässt dies nur zu, wenn derselbe Wert bereits in Country.CountryId
vorhanden ist Säule. Dadurch wird sichergestellt, dass die referenzielle Integrität innerhalb der Datenbank aufrechterhalten wird.
Beispiel 4 – Weitere Optionen
Es ist möglich, Ihrer Fremdschlüsseldefinition weitere Optionen hinzuzufügen.
Sie können beispielsweise einen Namen für den Fremdschlüssel angeben. Sie können auch angeben, was mit Werten in dieser Spalte passieren soll, wenn der entsprechende Wert im Primärschlüssel aktualisiert oder gelöscht wird.
Hier erstelle ich beide Tabellen erneut, aber dieses Mal gebe ich diese Optionen explizit an (ich mache dasselbe für die Primärschlüssel):
CREATE TABLE Country ( CountryId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_Country_CountryId PRIMARY KEY CLUSTERED (CountryId), CountryName nvarchar(60) ); CREATE TABLE City ( CityId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_City_CityId PRIMARY KEY CLUSTERED (CityId), CountryId int NOT NULL, CONSTRAINT FK_City_Country FOREIGN KEY (CountryID) REFERENCES Country (CountryID) ON DELETE CASCADE ON UPDATE CASCADE, CityName nvarchar(60) );
In diesem Fall beginnt die Fremdschlüsseldefinition mit CONSTRAINT
, gefolgt vom Namen des Fremdschlüssels, gefolgt von FOREIGN KEY
, gefolgt von der Spalte, auf die die Fremdschlüsseleinschränkung angewendet wird (in Klammern eingefügt).
Wir sehen dann dieselben REFERENCES
Klausel, die wir im vorherigen Beispiel gesehen haben.
Der ON DELETE CASCADE
und ON UPDATE CASCADE
-Klauseln werden verwendet, um sicherzustellen, dass Änderungen an Country
vorgenommen werden Tabelle werden automatisch an City
weitergegeben Tisch. Wenn beispielsweise eine Zeile aus der übergeordneten Tabelle (Primärschlüssel) gelöscht wird, werden alle entsprechenden Zeilen aus der referenzierenden Tabelle (Fremdschlüssel) gelöscht.
Der Standardwert für ON DELETE
und ON UPDATE
ist NO ACTION
. In diesem Fall löst die Datenbank-Engine einen Fehler aus, und die Aktualisierungs- oder Löschaktion für die Zeile in der übergeordneten Tabelle wird rückgängig gemacht.
Sie können auch SET NULL
verwenden um die Fremdschlüsselspalte auf NULL
zu setzen (erfordert, dass die Fremdschlüsselspalte nullfähig ist) oder SET DEFAULT
um sie auf ihren Standardwert zu setzen (erfordert, dass die Fremdschlüsselspalte eine Standarddefinition hat. Wenn eine Spalte nullable ist und kein expliziter Standardwert gesetzt ist, NULL
wird zum impliziten Standardwert der Spalte).
In diesem Beispiel habe ich auch die Gelegenheit genutzt, die Primärschlüssel zu benennen. Sie können sehen, dass die Primärschlüsselsyntax der Fremdschlüsselsyntax ähnelt, jedoch ohne die REFERENCES
-Klausel (und mit einem hinzugefügten CLUSTERED
-Argument, das der Standardwert für Primärschlüssel ist).
Überprüfen Sie nun den Fremdschlüssel:
EXEC sp_fkeys @fktable_name = City;
Ergebnis:
PKTABLE_QUALIFIER | FK_Test PKTABLE_OWNER | dbo PKTABLE_NAME | Country PKCOLUMN_NAME | CountryId FKTABLE_QUALIFIER | FK_Test FKTABLE_OWNER | dbo FKTABLE_NAME | City FKCOLUMN_NAME | CountryId KEY_SEQ | 1 UPDATE_RULE | 0 DELETE_RULE | 0 FK_NAME | FK_City_Country PK_NAME | PK_Country_CountryId DEFERRABILITY | 7
Wir können sehen, dass der Name des Fremdschlüssels jetzt FK_City_Country ist und die Primärschlüsseleinschränkung der Spalte, auf die sie verweist, heißt PK_Country_CountryId .
Beispiel 5 – Fremdschlüssel auf mehreren Spalten
Sie können auch einen Fremdschlüssel für mehrere Spalten erstellen, der auf einen mehrspaltigen Primärschlüssel verweist. Mehrspaltige Primärschlüssel werden auch als zusammengesetzte Primärschlüssel bezeichnet. Um einen zusammengesetzten Fremdschlüssel zu erstellen, trennen Sie die Spalten bei der Definition des Schlüssels einfach durch ein Komma.
So:
CONSTRAINT FK_FKName FOREIGN KEY (FKColumn1, FKColumn2) REFERENCES PrimaryKeyTable (PKColumn1, PKColumn2)
Ein ausführlicheres Beispiel finden Sie unter So erstellen Sie einen zusammengesetzten Fremdschlüssel in SQL Server.
Ist der Primärschlüssel wirklich notwendig?
Ein Primärschlüssel ist für Fremdschlüssel nicht unbedingt erforderlich, da Sie eine eindeutige Einschränkung oder einen eindeutigen Index verwenden könnten. In der Microsoft-Dokumentation heißt es insbesondere:
FOREIGN KEY
Beschränkungen können nur auf Spalten in PRIMARY KEY
verweisen oder UNIQUE
Einschränkungen in der referenzierten Tabelle oder in einem UNIQUE INDEX
auf der referenzierten Tabelle.
Während es also normalerweise eine gute Praxis ist, Primärschlüssel für alle Tabellen zu haben, müssen Ihre Fremdschlüssel nicht darauf verweisen.