Referentielle CONSTRAINT-Definition (referential_constraint_definition)
Eine referentielle CONSTRAINT-Definition (
referential_constraint_definition
) definiert eine Integritätsbedingung (Beschränkungen für Spaltenwerte, siehe
Datenintegrität), 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.
Syntax
<referential_constraint_definition> ::=
FOREIGN KEY [<referential_constraint_name>] (<referencing_column>,...)
REFERENCES <referenced_table> [(<referenced_column>,...)] [<delete_rule>]
referential_constraint_name,
delete_rule
referenced_table
referenced_column |
referenzierte Tabelle, referenzierte Spalte (Tabelle/Spalte, die angesprochen werden soll) |
referencing_column |
referenzierende Spalte (Spalte, die die Verbindung zu der anzusprechenden Spalte herstellt) |

Abhängigkeit zwischen den Beispieltabellen
kunde und
buchung. Die referentielle CONSTRAINT-Definition wird bei der Definition der Tabelle
buchung
festgelegt. Der Tabelle
buchung
wird ein sogenannter Fremdschlüssel zugewiesen, der dem Schlüssel von
kunde
entspricht.
CREATE TABLE buchung (bnr FIXED (4) KEY, knr FIXED (4), hnr FIXED (4)
raumtyp CHAR (6), ankunft DATE, abreise DATE,
FOREIGN KEY (knr) REFERENCES kunde ON DELETE CASCADE
Die definierte Beziehung bekommt den Namen
kunde_buchung
. Die DELETE-Regel
ON DELETE CASCADE
legt fest, daß, wenn Zeilen der Kundentabelle gelöscht werden, die zugehörigen Buchungszeilen ebenfalls automatisch gelöscht werden.
Erläuterung
Eine referentielle CONSTRAINT-Definition kann in einer
CREATE TABLE-Anweisung oder
ALTER TABLE-Anweisung verwendet werden. Die in der entsprechenden Anweisung angegebene Tabelle (
table_name
) wird im folgenden als referenzierende Tabelle bezeichnet.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.
Referenzierte Spalten (
referenced_column
)
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 muß die referenzierte Tabelle eine
UNIQUE-Definition besitzen, deren Spaltennamen und Reihenfolge der Spalten mit den referenzierten Spalten übereinstimmen.
Beziehung zwischen referenzierten und referenzierenden Spalten:
Die Anzahl der referenzierten und der referenzierenden Spalten muß übereinstimmen.
Die n-te referenzierende Spalte korrespondiert mit der n-ten referenzierten Spalte.
Datentyp und Länge jeder referenzierenden Spalte muß 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 muß das ALTER-Privileg für die referenzierende Tabelle und das REFERENCE-Privileg für die referenzierte Tabelle haben.
Name eines referentiellen Constraints (
referential_constraint_name
)
Der
Name eines referentiellen Constraints kann nach den Schlüsselworten
FOREIGN KEY
angegeben werden.- Wenn der Name eines referentiellen Constraints angegeben ist, muß 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.
Einfügen und Ändern von Zeilen der referenzierten Tabelle
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:
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.
Weitere Begriffe
DELETE-Regel
CASCADE-Abhängigkeit
Referenz-Zyklus
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.
In der Datenbanktabelle SQLCA wird der dritte Eintrag von SQLERRD beim Löschen von Zeilen aus einer referenzierten Tabelle (
referenced_table
) mit der Anzahl der in der referenzierten Tabelle gelöschten Zeilen belegt.
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 (siehe
CONNECT-Anweisung).