## Fremdschlüsselbeziehungen zwischen Tabellen

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.

### Voraussetzungen

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)

### Anlegen eines Fremdschlüssels

Sie können einen Fremdschlüssel (referentielles Constraint) direkt bei der Tabellendefinition angeben oder nachträglich zu einer vorhandenen Tabelle hinzufügen.

#### Einfache Fremdschlüssel

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.

#### Fremdschlüssel über mehrere Spalten

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

### Löschen eines Fremdschlüssels

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