Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So erstellen Sie einen Fremdschlüssel in SQL Server (T-SQL-Beispiele)

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.