Zwischen zwei Tabellen lässt sich eine Abhängigkeit definieren, die Auswirkungen bei der Veränderung von Zeilen hat. Dieser Zusammenhang wird als referentielles Constraint (oder auch Fremdschlüsselbeziehung) bezeichnet.
Sie benötigen die Demo-Daten für das SQL-Tutorial.
Starten Sie das Query Tool SQL Studio als Datenbankadministrator MONA mit dem Kennwort RED und melden Sie sich an die Demo-Datenbankinstanz DEMODB an.
SQL-Referenzhandbuch, Referentielle
CONSTRAINT-Definition (referential_constraint_definition)
Sie können einen Fremdschlüssel (referentielles Constraint) direkt bei der Tabellendefinition angeben oder nachträglich zu einer vorhandenen Tabelle hinzufügen.
Sie können Fremdschlüsselbeziehungen definieren, die sich nur auf eine Primärschlüsselspalte einer Tabelle beziehen.
Sie können die CREATE TABLE-Anweisung verwenden, um Fremdschlüssel beim Anlegen einer Tabelle zu definieren.
...
1.
Löschen Sie die Tabelle hotel.
DROP TABLE hotel.hotel
2.
Legen Sie die
Tabelle hotel wie folgt an:
CREATE TABLE
hotel.hotel
(hno FIXED(4) PRIMARY KEY CONSTRAINT
hno_cons CHECK hno > 0,
name CHAR(50) NOT NULL,
zip CHAR(5) CONSTRAINT zip_cons
CHECK
SUBSTR(zip,1,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,2,1)
BETWEEN '0' AND '9' AND
SUBSTR(zip,3,1)
BETWEEN '0' AND '9' AND
SUBSTR(zip,4,1)
BETWEEN '0' AND '9' AND
SUBSTR(zip,5,1)
BETWEEN '0' AND '9',
address CHAR(40) NOT NULL,
FOREIGN KEY hotel_zip_in_city (zip) REFERENCES hotel.city ON DELETE
RESTRICT)
Die Tabellen city und hotel lassen sich über die Postleitzahl miteinander verknüpfen, da die Postleitzahlenspalte in der Tabelle city die Primärschlüsselspalte ist. Die Tabelle hotel bekommt durch die Syntaxregel FOREIGN KEY den Fremdschlüssel (referentielles Constraint) hotel_zip_in_city für die Spalte zip zugewiesen
Tabelle CITY
ZIP |
NAME |
STATE |
Tabelle HOTEL
HNO |
NAME |
ZIP |
.... |
Der Name des Fremdschlüssels (referentiellen Constraint) hotel_zip_in_city wurde nach den Schlüsselworten FOREIGN KEY angegeben. Wird der Name nicht angegeben, so vergibt das Datenbanksystem selbst folgenden Namen: city_hotel, d.h. die Namen der beteiligten Tabellen werden mit einem Unterstrich verbunden.
Über ein hinter dem Schlüsselwort DELETE anzugebendes Schlüsselwort kann festgelegt werden, was mit abhängigen Werten bei Löschung von Zeilen geschehen soll.
Zeilen der Ortstabelle sollten z.B. nur dann gelöscht werden, wenn keine Hoteleinträge mehr für diese Orte vorhanden sind. Ist das doch der Fall, können Sie z.B. unter folgenden Möglichkeiten wählen:
● ON DELETE RESTRICT: Sie erhalten eine Warnung, die Zeilen werden in der Tabelle city nicht gelöscht.
● ON DELETE CASCADE: Entsprechende Zeilen werden in der Orts- und in der Hoteltabelle gelöscht.
● ON DELETE SET NULL: In der Hoteltabelle sinnlos gewordene Einträge werden auf den NULL-Wert gesetzt.
● ON DELETE SET DEFAULT: In der Hoteltabelle sinnlos gewordene Einträge werden auf den Default-Wert gesetzt.
Wenn Sie in die Tabelle hotel eine Zeile einfügen oder ändern, zu der kein Ort vorhanden ist, wird dies durch den Fremdschlüssel hotel_zip_in_city verhindert.
Siehe auch:
SQL-Referenzhandbuch, CREATE TABLE-Anweisung
(create_table_statement)
Sie können die ALTER TABLE-Anweisung verwenden, um Fremdschlüssel zu bereits vorhandenen Tabellen hinzuzufügen.
ALTER TABLE hotel.reservation ADD FOREIGN KEY reservation_cno_in_customer (cno) REFERENCES hotel.customer ON DELETE CASCADE
Für die Tabelle reservation wurde ein Fremdschlüssel auf der Kundennummerspalte hinzugefügt. Diese Spalte ist in der Tabelle customer Primärschlüsselspalte.
Sie können einen Fremdschlüssel auf mehrere Primärschlüsselspalten definieren.
ALTER TABLE hotel.reservation ADD FOREIGN KEY reservation_info_in_room (hno,type) REFERENCES hotel.room ON DELETE CASCADE
Für die Tabelle reservation wurde ein Fremdschlüssel auf die Spalten hno und type hinzugefügt. Diese Spalten sind in der Tabelle room Primärschlüsselspalten.
Siehe auch:
SQL-Referenzhandbuch, ALTER TABLE-Anweisung
(alter_table_statement)
SQL-Referenzhandbuch, ADD-Definition
(add_definition)
Systemtabellen
auswerten, FOREIGNKEYS,
FOREIGNKEYCOLUMNS
Sie können die ALTER TABLE-Anweisung verwenden, um Fremdschlüssel zu löschen.
ALTER TABLE hotel.reservation DROP FOREIGN KEY reservation_info_in_room
Siehe auch:
SQL-Referenzhandbuch, DROP-Definition (drop_definition)
Weitere Beispiele zur Datendefinition