Freigeben über


Erstellen von Fremdschlüssel-Beziehungen

Gilt für: SQL Server 2016 (13.x) und höher Azure SQL-Datenbank Azure SQL Managed Instance

In diesem Artikel wird beschrieben, wie Fremdschlüsselbeziehungen in SQL Server mithilfe von SQL Server Management Studio oder Transact-SQL erstellt werden. Sie erstellen eine Beziehung zwischen zwei Tabellen, wenn Sie die Zeilen der einen Tabelle mit den Zeilen der anderen Tabelle verknüpfen möchten.

Berechtigungen

Zum Erstellen einer neuen Tabelle mit einem Fremdschlüssel sind die CREATE TABLE-Berechtigung für die Datenbank und die ALTER SCHEMA-Berechtigung für das Schema erforderlich, in dem die Tabelle erstellt wird.

Zum Erstellen eines Fremdschlüssels für eine vorhandene Tabelle ist die ALTER TABLE-Berechtigung für die Tabelle erforderlich.

Begrenzungen

  • Eine FOREIGN KEY-Einschränkung muss nicht nur mit einer PRIMARY KEY-Einschränkung einer anderen Tabelle verknüpft sein. Fremdschlüssel können auch so definiert werden, dass sie auf die Spalten einer UNIQUE-Einschränkung in einer anderen Tabelle verweisen.

  • Wenn ein anderer Wert als NULL in die Spalte einer FOREIGN KEY-Einschränkung eingegeben wird, muss der Wert in der Spalte vorhanden sein, auf die verwiesen wird. Andernfalls wird eine Fehlermeldung zu einem Fremdschlüsselverstoß zurückgegeben. Um sicherzustellen, dass alle Werte einer zusammengesetzten FOREIGN KEY-Einschränkung überprüft werden, legen Sie NOT NULL für alle betroffenen Spalten fest.

  • FOREIGN KEY-Einschränkungen können nur auf Tabellen verweisen, die sich innerhalb derselben Datenbank auf demselben Server befinden. Datenbankübergreifende referenzielle Integrität muss durch Trigger implementiert werden. Weitere Informationen finden Sie unter CREATE TRIGGER (Transact-SQL).

  • FOREIGN KEY-Einschränkungen können auf eine andere Spalte in derselben Tabelle verweisen. Dies wird als Eigenverweis bezeichnet.

  • Eine auf Spaltenebene angegebene FOREIGN KEY-Einschränkung kann nur eine Verweisspalte auflisten. Diese Spalte muss denselben Datentyp aufweisen wie die Spalte, für die die Einschränkung definiert wurde.

  • Eine auf Tabellenebene angegebene FOREIGN KEY-Einschränkung muss ebenso viele Verweisspalten haben, wie sich Spalten in der Einschränkungsspaltenliste befinden. Der Datentyp jeder Verweisspalte muss ebenfalls mit dem der entsprechenden Spalte in der Spaltenliste übereinstimmen.

  • Die Datenbank-Engine weist keinen vordefinierten Grenzwert für die Anzahl von FOREIGN KEY-Einschränkungen auf, die eine Tabelle, die auf andere Tabellen verweist, enthalten kann. Die Datenbank-Engine begrenzt außerdem auch nicht die Anzahl von FOREIGN KEY-Einschränkungen im Besitz anderer Tabellen, die auf eine bestimmte Tabelle verweisen. Die tatsächlich verwendete Anzahl von FOREIGN KEY-Einschränkungen wird jedoch durch die Hardwarekonfiguration und den Entwurf der Datenbank und der Anwendung begrenzt. Eine Tabelle kann auf maximal 253 andere Tabellen und Spalten als Fremdschlüssel (ausgehende Referenzen) verweisen. In SQL Server 2016 (13.x) und neueren Versionen wurde der Grenzwert für die Anzahl der anderen Tabellen und Spalten, die auf Spalten in einer einzelnen Tabelle (eingehende Referenzen) verweisen können, von 253 auf 10.000 erhöht. (Kompatibilitätsgrad 130 oder höher erforderlich.) Für die Erhöhung gelten folgende Einschränkungen:

    • Mehr als 253 Fremdschlüsselverweise werden nur für DELETE- und UPDATE-DML-Vorgänge unterstützt. MERGE-Operationen werden nicht unterstützt.

    • Auch eine Tabelle mit einem Fremdschlüsselverweis auf sich selbst ist auf 253 Fremdschlüsselverweise beschränkt.

    • Für Columnstore-Indizes oder speicheroptimierte Tabellen sind derzeit nicht mehr als 253 Fremdschlüsselverweise möglich.

  • FOREIGN KEY-Einschränkungen werden nicht für temporäre Tabellen erzwungen.

  • Wenn ein Fremdschlüssel für eine Spalte eines CLR-benutzerdefinierten Typs definiert wird, muss die Implementierung des Typs eine binäre Sortierreihenfolge unterstützen. Weitere Informationen finden Sie unter Benutzerdefinierte CLR-Typen.

  • Eine Spalte vom Typ varchar(max) kann nur dann in eine FOREIGN KEY-Einschränkung einbezogen werden, wenn der Primärschlüssel, auf den sie verweist, ebenfalls als Typ varchar(max) definiert ist.

Erstellen einer Fremdschlüsselbeziehung im Tabellen-Designer

Verwenden von SQL Server Management Studio

  1. Klicken Sie in Objekt-Explorer mit der rechten Maustaste auf die Tabelle, die sich auf der Fremdschlüsselseite der Beziehung befindet, und wählen Sie Entwerfen aus.

    Die Tabelle öffnet sich in Datenbanktabellen erstellen und aktualisieren.

  2. Wählen Sie im Menü Tabellen-Designer die Option Beziehungen aus. (Verwenden Sie das Menü Tabellen-Designer in der Kopfzeile, oder klicken Sie mit der rechten Maustaste in den leeren Bereich der Tabellendefinition, und wählen Sie dann Beziehungen aus.)

  3. Wählen Sie im Dialogfeld Foreign-key Relationships (Fremdschlüsselbeziehungen) die Option Hinzufügen aus.

    Die Beziehung wird in der Liste Ausgewählte Beziehung mit einem vom System bereitgestellten Namen im Format „FK_<tablename>_<tablename>“ angezeigt. Hierbei steht der erste tablename für den Namen der Fremdschlüsseltabelle und der zweite tablename für den Namen der Primärschlüsseltabelle. Dies ist einfach eine standardmäßige und gängige Namenskonvention für das Feld (Name) des Fremdschlüsselobjekts.

  4. Wählen Sie die Beziehung in der Liste Selected Relationship (Ausgewählte Beziehung) aus.

  5. Wählen Sie im Raster rechts Tabellen- und Spaltenspezifikation aus, und wählen Sie anschließend die rechts neben der Eigenschaft angezeigten Auslassungspunkte (...) aus.

  6. Wählen Sie im Dialogfeld Tabellen und Spalten in der Dropdownliste Primärschlüssel die Tabelle aus, die sich auf der Primärschlüsselseite der Beziehung befinden soll.

  7. Wählen Sie im Raster unter dem Dialog die Spalten aus, die für den Primärschlüssel der Tabelle verwendet werden sollen. Geben Sie in die jeweils rechts neben den einzelnen Spalten angrenzende Rasterzelle die entsprechende Fremdschlüsselspalte aus der Fremdschlüsseltabelle ein.

    DerTabellen-Designer schlägt einen Namen für die Beziehung vor. Wenn Sie diesen Namen ändern möchten, bearbeiten Sie den Inhalt des Textfelds Beziehungsname .

  8. Klicken Sie auf OK , um die Beziehung zu erstellen.

  9. Schließen Sie das Fenster mit dem Tabellen-Designer, und Speichern Sie Ihre Änderungen, damit die Änderung der Fremdschlüsselbeziehung wirksam wird.

Erstellen eines Fremdschlüssels in einer neuen Tabelle

Verwenden von Transact-SQL

Im folgenden Beispiel wird eine Tabelle erstellt und eine Fremdschlüsseleinschränkung für die Spalte TempID definiert, die auf die Spalte SalesReasonID in der Tabelle Sales.SalesReason in der AdventureWorks-Datenbank verweist. Die Klauseln ON DELETE CASCADE und ON UPDATE CASCADE werden verwendet, um sicherzustellen, dass an der Sales.SalesReason-Tabelle vorgenommene Änderungen automatisch an die Tabelle Sales.TempSalesReason weitergegeben werden.

CREATE TABLE Sales.TempSalesReason (
    TempID INT NOT NULL,
    Name NVARCHAR(50),
    CONSTRAINT PK_TempSales
        PRIMARY KEY NONCLUSTERED (TempID),
    CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
        REFERENCES Sales.SalesReason(SalesReasonID)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

Erstellen eines Fremdschlüssels in einer vorhandenen Tabelle

Verwenden von Transact-SQL

Im folgenden Beispiel wird ein Fremdschlüssel für die Spalte TempID erstellt und auf die Spalte SalesReasonID in der Tabelle Sales.SalesReason in der AdventureWorks-Datenbank verwiesen.

ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
   ON DELETE CASCADE
   ON UPDATE CASCADE;