Anfang des Inhaltsbereichs

Referentielle CONSTRAINT-Definition (referential_constraint_definition) Dokument im Navigationsbaum lokalisieren

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)

Beispiel

Abhängigkeit zwischen den Beispieltabellen customer und reservation. Die referentielle CONSTRAINT-Definition wird bei der Definition der Tabelle reservation festgelegt. Der Tabelle reservation wird ein sogenannter Fremdschlüssel zugewiesen, der dem Schlüssel von customer entspricht.

CREATE TABLE reservation (rno FIXED(4) PRIMARY KEY, cno FIXED(4), hno FIXED(4), roomtype CHAR(6), arrival DATE, departure DATE,

FOREIGN KEY customer_reservation (cno) REFERENCES customer ON DELETE CASCADE)

Die definierte Beziehung bekommt den Namen customer_reservation. Die DELETE-Regel ON DELETE CASCADE legt fest, dass, 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:

·        Z ist eine  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.

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.

Ende des Inhaltsbereichs