Eine referentielle CONSTRAINT-Definition (referential_constraint_definition) definiert eine Integritätsbedingung, der alle Zeilen zweier Tabellen genügen müssen. Die dadurch definierte Abhängigkeit zwischen zwei Tabellen hat Auswirkungen auf Veränderungen, die an deren Zeilen gewünscht werden.
<referential_constraint_definition>
::=
FOREIGN KEY [<referential_constraint_name>]
(<referencing_column>,...)
REFERENCES <referenced_table> [(<referenced_column>,...)] [<delete_rule>]
<referencing_column>
::= <column_name>
<referenced_table> ::= <table_name>
<referenced_column> ::= <column_name>
referenced_table |
referenzierte Tabelle, referenzierte Spalte (Tabelle/Spalte, die angesprochen werden soll) |
referencing_column |
referenzierende Spalte (Spalte, die die Verbindung zu der anzusprechenden Spalte herstellt) |
SQL-Tutorial, Fremdschlüsselbeziehungen zwischen
Tabellen
Eine referentielle CONSTRAINT-Definition kann in einer CREATE TABLE-Anweisung oder ALTER TABLE-Anweisung (ADD-Definition) verwendet werden. Die in der entsprechenden Anweisung angegebene Tabelle table_name wird im folgenden als referenzierende Tabelle bezeichnet.
Der Name eines referentiellen Constraint kann nach den Schlüsselworten FOREIGN KEY angegeben werden.
· Wenn der Name eines referentiellen Constraints angegeben ist, muss dieser sich von allen anderen Namen referentieller Constraints der referenzierenden Tabelle unterscheiden.
· Wenn kein Name eines referentiellen Constraints angegeben ist, wird vom Datenbanksystem ein eindeutiger Name (bezogen auf die referenzierende Tabelle) vergeben.
Die referenzierenden Spalten referencing_column werden in der referentiellen CONSTRAINT-Definition angegeben. Die referenzierenden Spalten müssen Spalten der referenzierenden Tabelle bezeichnen und alle voneinander verschieden sein. Sie werden auch als Fremdschlüsselspalten bezeichnet.
· Wenn keine referenzierten Spalten angegeben werden, hat das die Wirkung wie die Angabe der Schlüsselspalten der referenzierten Tabelle referenced_table in der definierten Reihenfolge.
· Wenn referenzierte Spalten angegeben werden, die nicht der Schlüssel der referenzierten Tabelle sind, dann muss die referenzierte Tabelle eine UNIQUE-Definition besitzen, deren Spaltennamen und Reihenfolge der Spalten mit den referenzierten Spalten übereinstimmen.
· Die Anzahl der referenzierten und der referenzierenden Spalten muss übereinstimmen.
· Die n-te referenzierende Spalte korrespondiert mit der n-ten referenzierten Spalte.
· Datentyp und Länge jeder referenzierenden Spalte muss mit dem Datentyp und der Länge der korrespondierenden referenzierten Spalte übereinstimmen.
Referenzierende und referenzierte Tabelle müssen Basistabellen, dürfen jedoch keine temporären Tabellen sein.
Der aktuelle Benutzer muss das ALTER-Privileg für die referenzierende Tabelle und das REFERENCE-Privileg für die referenzierte Tabelle haben.
Das Einfügen und Ändern von Zeilen der referenzierenden Tabelle unterliegt folgenden Einschränkungen:
Sei Z eine einzufügende oder geänderte Zeile. Das Einfügen und Ändern ist nur dann möglich, wenn für jede zugehörige referenzierte Tabelle referenced_table eine der folgenden Bedingungen erfüllt ist:
· Z ist eine Trefferzeile
· Z enthält in einer der referenzierenden Spalten referencing_column einen NULL-Wert.
· Die referentielle CONSTRAINT-Definition definiert die DELETE-Regel ON DELETE SET DEFAULT, und Z enthält in jeder referenzierenden Spalte den DEFAULT-Wert.
Bei Anwendung einer INSERT- oder einer
UPDATE-Anweisung auf eine referenzierende Tabelle verwendet das
Datenbanksystem unabhängig vom für die aktuelle Sitzung aktuellen Isolation-Level
ein Sperrverhalten für die referenzierte Tabelle, das dem Isolation-Level 1
entspricht.
Bei Anwendung einer DELETE-Anweisung auf eine referenzierte Tabelle verwendet
das Datenbanksystem ein Sperrverhalten, das dem Isolation-Level 3
entspricht.
Eine Zeile der referenzierenden Tabelle heißt Trefferzeile einer Zeile der referenzierten Tabelle referenced_table, wenn die Werte der korrespondierenden referenzierenden Spalten referencing_column und referenzierten Spalten referenced_column gleich sind.
Eine referentielle CONSTRAINT-Definition definiert eine 1:n-Beziehung zwischen zwei Tabellen. Das bedeutet, dass zu jeder Zeile der referenzierten Tabelle mehrere Trefferzeilen existieren können.
Eine Änderung einer Zeile der referenzierten Tabelle in einer referenzierten Spalte scheitert, wenn mindestens eine Trefferzeile existiert.
Eine Tabelle T* heißt CASCADE-abhängig von einer Tabelle T, wenn es eine Folge von referentiellen CONSTRAINT-Definitionen R1, R2, ..., Rn (n>=1) gibt, so dass gilt:
· T* ist referenzierende Tabelle von R1
· T ist referenzierte Tabelle referenced_table von Rn
· Alle referentiellen CONSTRAINT-Definitionen verwenden CASCADE.
· Für i=1,...,n-1, n>1 ist die referenzierte Tabelle von Ri referenzierende Tabelle von Ri+1
Seien R1 und R2 zwei verschiedene referentielle CONSTRAINT-Definitionen mit derselben referenzierenden Tabelle S. Die referenzierte Tabelle von R1 sei T1, die von R2 sei T2.
Wenn die Tabellen T1 und T2 gleich sind, oder wenn es eine Tabelle T gibt, so dass T1 und T2 CASCADE-abhängig von T sind, dann müssen R1 und R2 entweder beide CASCADE oder beide RESTRICT spezifizieren.
Es gibt zwei verschiedene Folgen von referentiellen CONSTRAINT-Definitionen, die die Tabellen S und T verbinden. Eine DELETE-Anweisung auf die Tabelle T hat eine Aktion in der Tabelle S zur Folge. Damit das Ergebnis der DELETE-Anweisung nicht abhängig davon ist, welche der beiden verschiedenen Folgen von referentiellen CONSTRAINT-Definitionen abgearbeitet wird, wurde die obige Einschränkung für R1 und R2 gewählt.
Ein Referenz-Zyklus ist eine Folge von referentiellen CONSTRAINT-Definitionen R1, R2,...,Rn mit n>1, für die folgenden Bedingungen gelten:
· Für i=1,...,n-1 ist die referenzierte Tabelle referenced_table von Ri die referenzierende Tabelle von Ri+1.
· Die referenzierte Tabelle von Rn ist die referenzierende Tabelle von R1.
Ein Referenz-Zyklus, in dem alle referentiellen CONSTRAINT-Definitionen CASCADE spezifizieren, ist nicht erlaubt.
Ein Referenz-Zyklus, in dem eine referentielle CONSTRAINT-Definition nicht CASCADE spezifiziert und alle übrigen referentiellen CONSTRAINT-Definitionen CASCADE spezifizieren, ist nicht erlaubt.
Eine referentielle CONSTRAINT-Definition heißt selbst-referenzierend, wenn die referenzierte Tabelle referenced_table und die referenzierende Tabelle übereinstimmen.
Bei selbst-referenzierenden referentiellen CONSTRAINT-Definitionen kann die Abarbeitungsfolge einer DELETE-Anweisung von Bedeutung sein.
Angabe von CASCADE: Zunächst werden alle von der DELETE-Anweisung betroffenen Zeilen unter Nichtbeachtung der referentiellen CONSTRAINT-Bedingungen gelöscht. Anschließend werden alle Trefferzeilen der soeben gelöschten Zeilen gelöscht. Sodann werden alle Trefferzeilen des eben vorangegangenen Löschvorgangs gelöscht, usw.
Angabe von SET NULL oder SET DEFAULT: Zunächst werden alle von der DELETE-Anweisung betroffenen Zeilen unter Nichtbeachtung der referentiellen CONSTRAINT-Bedingungen gelöscht. Anschließend wird auf die Trefferzeile SET NULL bzw. SET DEFAULT angewandt.
Siehe auch: