FOREIGN KEY-Einschränkungen

Ein Fremdschlüssel (FS) ist eine Spalte oder eine Kombination von Spalten, mit deren Hilfe eine Verknüpfung zwischen den Daten in zwei Tabellen eingerichtet und erzwungen wird. Sie können einen Fremdschlüssel erstellen, wenn Sie beim Erstellen oder Ändern einer Tabelle eine FOREIGN KEY-Einschränkung definieren.

In einem Fremdschlüsselverweis wird zwischen zwei Tabellen eine Verknüpfung erstellt, wenn eine Spalte bzw. mehrere Spalten einer Tabelle auf die Spalte bzw. Spalten mit dem Primärschlüsselwert einer anderen Tabelle verweisen. Diese Spalte wird zu einem Fremdschlüssel in der zweiten Tabelle.

Nehmen Sie beispielsweise an, die Sales.SalesOrderHeader-Tabelle der AdventureWorks2008R2-Datenbank besitzt eine Verknüpfung mit der Sales.SalesPerson-Tabelle, da eine logische Beziehung zwischen Sales Orders (Kaufaufträgen) und Salespeople (Vertriebsmitarbeiter) besteht. Die SalesPersonID-Spalte der SalesOrderHeader-Tabelle stimmt mit der Primärschlüsselspalte der SalesPerson-Tabelle überein. Die SalesPersonID-Spalte der SalesOrderHeader-Tabelle ist der Fremdschlüssel für die SalesPerson-Tabelle.

SalesOrderHeader.SalesPersonID ist ein Fremdschlüssel.

Eine FOREIGN KEY-Einschränkung muss nicht notwendigerweise mit einer PRIMARY KEY-Einschränkung in einer anderen Tabelle verknüpft sein; sie kann auch so definiert werden, dass sie auf die Spalten einer UNIQUE-Einschränkung in einer anderen Tabelle verweist. Eine FOREIGN KEY-Einschränkung kann NULL-Werte enthalten. Wenn jedoch eine beliebige Spalte einer zusammengesetzten FOREIGN KEY-Einschränkung NULL-Werte enthält, wird die Überprüfung aller Werte, aus denen die FOREIGN KEY-Einschränkung besteht, ausgelassen. Um sicherzustellen, dass alle Werte einer zusammengesetzten FOREIGN KEY-Einschränkung überprüft werden, legen Sie NOT NULL für alle betroffenen Spalten fest.

HinweisHinweis

FOREIGN KEY-Einschränkungen können nur auf Spalten in derselben Tabelle oder in Tabellen, die sich innerhalb derselben Datenbank befinden, verweisen. Diese Tabellen werden als auf sich selbst verweisende Tabellen bezeichnet. Betrachten Sie beispielsweise eine Tabelle mit den drei Spalten employee_number, employee_name und manager_employee_number. Da der Manager ebenfalls ein Angestellter ist, gibt es eine Fremdschlüsselbeziehung zwischen der manager_employee_number-Spalte und der employee_number-Spalte.

Referenzielle Integrität

Eine FOREIGN KEY-Einschränkung dient zwar in erster Linie zur Kontrolle der Daten, die in der Fremdschlüsseltabelle gespeichert werden können; sie kontrolliert jedoch auch die Änderungen, die an Daten in der Primärschlüsseltabelle vorgenommen werden. Wenn z. B. die Zeile für einen Vertriebsmitarbeiter aus der Sales.SalesPerson-Tabelle gelöscht, die ID des Vertriebsmitarbeiters jedoch weiterhin für Kaufaufträge in der Sales.SalesOrderHeader-Tabelle verwendet wird, ist die relationale Integrität zwischen den beiden Tabellen zerstört. Die Kaufaufträge des gelöschten Verkäufers sind in der SalesOrderHeader-Tabelle verwaist, da keine Verknüpfung mehr zu Daten in der SalesPerson-Tabelle besteht.

Durch eine FOREIGN KEY-Einschränkung wird eine derartige Situation verhindert. Die Einschränkung erzwingt die referenzielle Integrität, indem sichergestellt wird, dass Änderungen an Daten in der Primärschlüsseltabelle nicht möglich sind, wenn diese Änderungen dazu führen, dass die Verknüpfung zu Daten in der Fremdschlüsseltabelle ungültig wird. Wird ein Versuch unternommen, eine Zeile in einer Primärschlüsseltabelle zu löschen oder einen Primärschlüsselwert zu ändern, erzeugt diese Aktion einen Fehler, wenn der gelöschte oder geänderte Primärschlüsselwert einem Wert in der FOREIGN KEY-Einschränkung einer anderen Tabelle entspricht. Um eine Zeile in einer FOREIGN KEY-Einschränkung erfolgreich ändern oder löschen zu können, müssen Sie zuerst die Fremdschlüsseldaten in der Fremdschlüsseltabelle entweder löschen oder so ändern, dass der Fremdschlüssel mit anderen Primärschlüsseldaten verknüpft ist.

Indizieren von FOREIGN KEY-Einschränkungen

Das Erstellen eines Indexes für einen Fremdschlüssel empfiehlt sich aus folgenden Gründen:

  • Änderungen an PRIMARY KEY-Einschränkungen werden mithilfe von FOREIGN KEY-Einschränkungen in verbundenen Tabellen überprüft.

  • Fremdschlüsselspalten werden häufig in Verknüpfungskriterien verwendet, wenn Daten aus verbundenen Tabellen in Abfragen kombiniert werden, indem die Übereinstimmungen zwischen der oder den Spalten in der FOREIGN KEY-Einschränkung einer Tabelle und der oder den Spalten eines Primärschlüssels oder eines eindeutigen Schlüssels in der anderen Tabelle ermittelt werden. Ein Index ermöglicht Database Engine (Datenbankmodul), die verbundenen Daten in der Fremdschlüsseltabelle schnell zu finden.Es ist jedoch nicht zwingend erforderlich, einen Index zu erstellen. Daten aus zwei verbundenen Tabellen können auch dann kombiniert werden, wenn zwischen diesen Tabellen keine PRIMARY KEY-Einschränkung oder FOREIGN KEY-Einschränkung definiert ist. Eine Fremdschlüsselbeziehung zwischen zwei Tabellen weist jedoch darauf hin, dass die beiden Tabellen dahingehend optimiert wurden, um in einer Abfrage kombiniert zu werden, die die Schlüssel als Kriterium verwendet. Weitere Informationen zum Verwenden von FOREIGN KEY-Einschränkungen mit Verknüpfungen finden Sie unter Grundlegendes zu Joins und Abfragetypen und Indizes.

Anzahl an FOREIGN KEY-Einschränkungen in einer Tabelle

In SQL Server ist weder Anzahl an FOREIGN KEY-Einschränkungen von Tabellen, die auf andere Tabellen verweisen, noch die Anzahl an FOREIGN KEY-Einschränkungen, die anderen Tabellen angehören und auf eine bestimmte Tabelle verweisen, begrenzt. Die tatsächliche Anzahl an FOREIGN KEY-Einschränkungen ist jedoch durch die Hardwarekonfiguration und den Entwurf der Datenbank und Anwendung begrenzt. Es wird empfohlen, in einer Tabelle nicht mehr als 253 FOREIGN KEY-Einschränkungen zu erstellen, und nicht mehr als 253 FOREIGN KEY-Einschränkungsverweise auf eine Tabelle zuzulassen. Ziehen Sie beim Entwerfen der Datenbank und der Anwendungen den Aufwand in Betracht, den das Erzwingen von FOREIGN KEY-Einschränkungen nach sich zieht.