Grundkurs SQL

7.5  Zusammenfassung DDL

Die Lektion 7 hat sich mit der Data Definition Language von SQL befasst. Es wurde im ersten Teil der Lektion gezeigt, wie man mit der SQL-Anweisung CREATE TABLE eine Datenbankstruktur aufbaut. Vertiefend wurde auf die Feinheiten bei der Erzeugung einer Tabelle und deren Attributen hingewiesen. Speziell beschäftigten wir uns in den Abschnitten mit den Einschränkungen der Tabellen, den sogenannten Integritätsbedingungen – beispielsweise für die referentielle Integrität, das Festlegen eines Primär- oder Fremdschlüssels. (Vergessen Sie nicht, dass die referentielle Integrität in MySQL nur beim Tabellentyp InnoDB wirklich unterstützt wird.)

Am Ende wurde betrachtet, wie die Datenbankobjekte nachträglich verändert bzw. gelöscht werden können.

Eine Datenbank erzeugen

Bisher wurde noch nicht gezeigt, wie man eine Datenbank über einen SQL-Befehl anlegt. Auch wenn das ANSI SQL keine Anweisung dafür bereit hält, haben die meisten RDBMS-Produkte einige SQL-Sprachelemente um Datenbanken physikalisch zu erzeugen. In der Regel legt man eine leere Datenbank über die Schlüsselwörter CREATE DATABASE an und löscht diese wieder über DROP DATABASE. Eine Anweisung könne so aussehen:

CREATE DATABASE Verzeichnis

Hinweise für das Anlegen der Datenbankstruktur

Beim Erzeugen von Tabellen, die auf eine andere Tabelle über einen Fremdschlüssel referenziert werden, gibt es eine bestimmte Reihenfolgen die beachtet werden sollte. Dies wurde auch schon in der Lektion erwähnt. Zuerst muss die Tabelle angelegt werden, auf welche in anderen Tabellen Bezug genommen werden soll!

In einem Beispiel wird in der Tabelle spielstaette auf die Tabelle ort verwiesen, daraus ergibt sich für das Anlegen der Tabellen, dass die ort als erste erzeugt werden muss. Würde eine andere Reihenfolge genommen werden, dann kommt es zwangsläufig zu einer Fehlermeldung vom Datenbanksystem. Die Tabelle spielstaette würde ins Leere verweisen, weil die andere Tabelle noch nicht existiert.

Wie kann dieses Problem umgangen werden?

Man definiert zunächst alle Tabellen ohne Fremdschlüsselbeziehungen. Die Reihenfolge der Tabellen ist dadurch nicht mehr relevant.
Danach können über ALTER TABLE die referentiellen Integritätsbedingungen bestimmt werden.

Das Code-Beispiel zeigt, wie es aussehen sollte (dies kann zur Übung auch getestet werden):

CREATE TABLE spielstaette
   (
     Haus VARCHAR (100) NOT NULL,
     Strasse VARCHAR (50) NOT NULL,
     Hausnummer CHAR (6),
     Plz CHAR(5),
     Beschreibung VARCHAR (255),

     CONSTRAINT primaryKey_spielstaette PRIMARY KEY (Haus)
   ) ENGINE=INNODB;

CREATE TABLE ort
   (
     Plz CHAR(5) NOT NULL,
     Ort VARCHAR (200) NOT NULL,

     CONSTRAINT primaryKey_ort PRIMARY KEY (Plz)
   ) ENGINE=INNODB;

ALTER TABLE spielstaette
   ADD CONSTRAINT fk_PlzOrt FOREIGN KEY (Plz) REFERENCES ort (Plz)
     ON DELETE SET NULL
     ON UPDATE CASCADE;

Generell kann man sich die folgende Vorgehensweise einprägen:

  1. Benutzerdefinierte Datentypen und Domains anlegen (hier nicht behandelt)
  2. Erstellen der Tabellen ohne Berücksichtigung der referentiellen Integritäten
  3. Mit ALTER TABLE die referentiellen Integritäten nachträglich einfügen

Beachten Sie, dass Fremdschlüssel in SQL nicht dazu benutzt werden, um Tabellen zu physisch zu verknüpfen, sondern hauptsächlich, um die referentielle Integrität zu überprüfen (Fremdschlüssel-Restriktionen).