Logo Wissenstransfer Gerhard at CichnaDotCom

>> Wissensdatenbank / Datenmodellierung und Datenbanksysteme

Konzeption und Modellierung von relationalen Datenbanken

Erzeugen von Tabellen in SQL-Datenbanken aus ER-Diagrammen

Bevor Daten in relationalen Datenbanken gespeichert werden können, muss die dafür vorgesehene Tabellenstruktur angelegt werden. Dieser Schritt entspricht in der objektorientierten Programmierung dem Anlegen von Klassen, bevor konkrete Objekte der Klasse erzeugt werden können. Das Anlegen von Tabellen erfolgt mit Ausdrücken einer Data Definition Language (DDL). Die Sprache SQL sieht dafür eine Menge an Schlüsselwörtern vor, von denen ein Auswahl der im praktischen Einsatz am häufigsten genutzten im Folgenden vorgestellt wird.

Datentypen in SQL

Zu jedem Attribut einer Tabelle in SQL muss ein Datentyp festgelegt werden. Mit der Definition des Datentyps wird automatisch auch der von der Datenbank zu reservierende Speicherplatz festgelegt. Darüber hinaus bestimmt die Auswahl des Datentyps auch, wie die gespeicherten Daten intern vom DBMS organisiert werden.

Zwar gibt SQL eine Menge von Datentypen vor, ob diese allerdings in einem DBMS auch tatsächlich implementiert sind, ist abhängig vom Hersteller des DBMS. Darüber hinaus haben konkrete DBMS eigene Datentypen, die nicht Teil des SQL-Standards sind, sich jedoch in der täglichen Arbeit als praktisch herausgestellt haben. Somit variiert die tatsächlich verfügbare Menge der Datentypen in einer Datenbank teilweise sehr deutlich von Hersteller zu Hersteller. Vor der Definition eines konkreten Datenschemas einer Datenbank müssen dem Entwickler Name, Versionsnummer und Hersteller des DBMS bekannt sein. Außerdem muss die technische Dokumentation der Datenbank verfügbar sein, damit die konkrete Umsetzung und spezifische Besonderheiten beim Einsatz von Datentypen nachgelesen werden können.

Hinweis
Wird bei der Definition des Datenschemas auf Standarddatentypen zurückgegriffen, die von fast allen DBMS unterstützt werden, so lässt sich eine Datenbank später leichter auf ein anderes DBMS portieren.

Texttypen
Grundsätzlich gibt es Texttypen, die, wie in folgender Tabelle gezeigt, eine fest vorgegebene, eine maximale und eine quasi unbegrenzte Menge an Schriftzeichen (engl.: character) speichern.

Texttypen in SQL, Auswahl
Art SQL-Datentypen Beispiele
Zeichenketten mit immer genau n Zeichen Länge CHAR(n)
alternativ:
CHARACTER(n)
Ländercodes: DE, CN, FR, NL etc.:
CHAR(2)
ISBN-13-Nummern: 9783836216999
CHAR(13)
UUIDs: 21EC2020-3AEA-1069-A2DD-08002B30309D
CHAR(36)
(deutsche) Postleitzahlen: 45147
CHAR(5)
Zeichenketten mit variabler, jedoch beschränkter
Länge (max. n Zeichen)
VARCHAR(n)
alternativ:
CHARACTER VARYING(n)
Eigennamen, Bezeichnungen, kurze
Beschreibungen:
VARCHAR(55), VARCHAR(160), VARCHAR(500)
Sehr lange Zeichenketten; die tatsächlich erlaubte
Größe wird durch technische Parameter innerhalb
des DBMS begrenzt.
TEXT Texte, Blogeinträge, ausführliche
Beschreibungen:
TEXT

Unter Umständen gibt es die Anforderung an die Datenbank, Texttypen in einem ganz bestimmten Zeichenformat, z.B. UTF-8 oder latin1 zu speichern. In diesem Fall ist bei der Definition von Textattributen auch auf das Zeichenformat zu achten, in dem die Textzeichen gespeichert werden. Das ist insbesondere für einen fehlerfreien Umgang mit Sonderzeichen und Umlauten (ä, ü, ö) wichtig.

Zahlentypen
In der folgenden Tabelle ist eine Auswahl von Zahlentypen dargestellt. Für die Speicherung von Geldbeträgen wird der Datentyp DECIMAL empfohlen, da mit diesem Typ die Anzahl der erforderlichen Nachkommastellen exakt vorgegeben wird.

Zahlentypen in SQL, Auswahl
Art SQL-Datentypen Beispiele
Ganze Zahlen; 32 Bit, Wertebereich von -2.147.483.648
bis 2.147.483.647
INTEGER
alternativ:
INT
Anzahl, Index, Nummerierungen:
INTEGER
Dezimalzahlen mit höchstens n Stellen insgesamt und
genau m Stellen hinter dem Komma
DECIMAL(n,m)
alternativ:
CHARACTER VARYING(n)
Geldbeträge:
DECIMAL(9,2)
Kennzahlen:
DECIMAL(4,2)
Gleitkommazahlen, 32 Bit REAL Messwerte:
REAL

Datumstypen
Die folgende Tabelle gibt einen Überblick über häufig eingesetzte Datentypen zur Speicherung von Datums- und Zeitangaben.

Datumstypen in SQL, Auswahl
Art SQL-Datentypen Beispiele
Taggenaue Kalenderdaten, vom Jahr 1000 bis zum Jahr
9999 im Format YYYY-MM-DD
DATE Datum, Kalendertage: 2014-06-14
Zeitangaben im Format HH:MM:SS TIME Uhrzeit, sekundengenau: 13:43:56
Genaue Bestimmung eines Zeitpunktes, sekundengenau,
oft im Format YYYY-MM-DD HH:MM:SS
TIMESTAMP Ausgewählte Zeitpunkte:
2014-06-14 14:00:02;
Automatisches Speichern von Ersellungs-
oder Änderungszeitpunkten

Weitere Datentypen
Die untenstehende Tabelle stellt je einen Datentypen zur Speicherung von Binärdaten und Boolschen Werten vor. Häufig bieten konkrete DBMS eigene Datentypen zur Speicherung von Binärtypen an. Die konkrete Umsetzung von Boolean variiert ebenfalls sehr stark, einige Hersteller speichern die Werte TRUE/FALSE, andere die Werte 0/1.

Weitere Datentypen in SQL, Auswahl
Art SQL-Datentypen Beispiele
Binärtypen mit variabler Länge, höchstens
jedoch n Zeichen (n Bit)
VARBINARY(n) Speichern von Binärdaten wie Bilder, Audio, Video
und andere Binärdateien;
BINARY VARYING(50000);
häufig in DBMS auch BLOB genannt
Boolsche Werte BOOLEAN Boolsche Werte

Anlegen von Tabellen mit SQL

Mit dem Anlegen einer Tabelle im DBMS wird die Struktur geschaffen, in der später die Datensätze physikalisch gespeichert werden. Zu einer Tabelle können dabei folgende Angaben definiert werden:

Der SQL-Befehl zum Erstellen einer Tabelle lautet CREATE TABLE. Das folgende Beispiel für ein SQL-Statement erstellt eine Tabelle mit dem Namen Kunde. Diese Tabelle hat vier Spalten: KundeID zum Speichern von Ganzzahlwerten, KundeNR zum Speichern einer Kundennummer, die maximal 15 Zeichen lang ist, sowie je eine Spalte Name und eine Spalte Vorname zum Speichern von Zeichenketten bis maximal 500 Zeichen Länge.

SQL-Statement
CREATE TABLE Kunde (
    KundeID INTEGER,
    Name VARCHAR(500),
    Vorname VARCHAR(500),
    KundeNR VARCHAR(15)
)

Ergebnis
Kunde
KundeID Name Vorname KundeNR
       

Hinweis
Müssen nach dem erstmaligen Anlegen Änderungen an der Tabellendefinition durchgeführt werden, wird dazu der SQL-Befehl ALTER TABLE genutzt.

Allgemeiner Aufbau von CREATE

Der allgemeine Aufbau von CREATE TABLE besteht aus den im Folgenden detailliert vorgestellten Elementen:

CREATE TABLE Name der Tabelle (
    Spaltendefinition,
    Primärschlüsseldefinition,
    [Integritätsregeln,]
    [Fremdschlüsseldefinition,]
    [Festlegung von Bedingungen zu Spalten]
)

Spaltendefinition

Folgende Eigenschaften können zu einer Tabellenspalte mit SQL definiert werden: Name, Datentyp, Defaultwert, Verbot von NULL-Werten, einzuhaltende Bedingungen und der Zwang zur Einzigartigkeit von Werten. Das allgemeine Schema zur Definition von Spalten kann wie folgt angegeben werden, [Elemente] in eckigen Klammern sind optional:

name datentyp [NOT NULL] [DEFAULT defaultwert] [UNIQUE] [CHECK (bedingung)]

Die folgende Tabelle beschreibt die Elemente und enthält jeweils auch konkrete Anwendungsbeispiele.

Elemente zur Spaltendefinition
Elemente zur Spaltendefinition Beschreibung Beispiel
name Tabellenweit eindeutiger Bezeichner für die Spalte. Name, Vorname, KundeID
datentyp Konkreter Datentyp der Spalte, gibt das Format der in
der Spalte gespeicherten Werte vor.
KundeID INTEGER,
Name VARCHAR(500),
Bestelldatum DATE
Optional:
NOT NULL
Verbietet NULL-Werte in der Spalte und erzwingt die
Eingabe eines gültigen Wertes aus dem Wertebereich
des Datentyps.
KundeID INTEGER NOT NULL,
Name VARCHAR(500) NOT NULL
Optional:
DEFAULT 'defaultwert'
Legt einen Defaultwert für dieses Attribut fest,
falls zu diesem Attribut kein Wert übergeben wurde
und verhindert NULL-Werte.
Sterne INTEGER DEFAULT '0',
Text VARCHAR(5000) DEFAULT 'kein Text eingegeben'
Optional:
UNIQUE
Erzwingt die Eindeutigkeit aller Werte dieser Spalte,
d.h. in dieser Spalte darf kein Wert mehrfach
vorkommen.
KundeID INTEGER UNIQUE
Optional:
CHECK (bedingung)
Hinweis:
Wird nicht durch MySQL 5.7
unterstützt.
Festlegungen von Bedingungen, die für eine Eintragung
des Datensatzes erfüllt werden müssen, z.B. Prüfen
von erlaubten Werten, Abhängigkeiten zu anderen
Attributen des Datensatzes.
Beginndatum DATE,
Endedatum DATE CHECK (Endedatum > Beginndatum)

Primärschlüsseldefinition mit PRIMARY KEY

Nach der Definition der einzelnen Spalten der Tabelle kann mit dem Schlüsselwort PRIMARY KEY die Menge der Spalten bestimmt werden, aus denen der Primärschlüssel für die Tabelle gebildet wird. Eine als Primärschlüssel definierte Spalte darf keine NULL-Werte enthalten und für die Kombination der verschiedenen Primärschlüsselspalten darf kein Wert mehrfach vergeben werden. Sofern ein Primärschlüssel aus mehreren Spalten besteht, darf aber jede einzelne dieser Spalten Werte mehrfach enthalten.

SQL-Statement
CREATE TABLE Adresse (
    AdresseID INTEGER,
    Strasse VARCHAR(500),
    Hausnummer VARCHAR(50),
    Ort VARCHAR(500),
    PLZ CHAR(5),
    PRIMARY KEY (AdresseID)
)

Ergebnis
Adresse
AdresseID Strasse Hausnummer Ort PLZ
         

Im obigen Beispiel wurde mit dem Attribut AdresseID ein künstlicher Schlüssel für diese Tabelle definiert, der nur innerhalb des DBMS verwendet wird und keine fachliche Entsprechung in der realen Welt hat. Beim Einsatz künstlicher Schlüssel kann das DBMS auch die automatische Generierung von eindeutigen Werten übernehmen. Unter der Voraussetzung, dass der Datentyp des künstlichen Schlüssels ein Ganzzahltyp ist, kann durch die Angabe eines herstellerabhängigen SQL-Schlüsselworts für jeden neuen Datensatz durch automatisches Hochzählen ein noch nicht vergebener und damit eindeutiger Wert erzeugt und gespeichert werden. Im folgenden Beispiel für das DBMS MariaDB lautet das Schlüsselwort AUTO_INCREMENT und ist Teil der Spaltendefinition:

SQL-Statement
CREATE TABLE Adresse (
    AdresseID INTEGER AUTO_INCREMENT,
    Strasse VARCHAR(500),
    Hausnummer VARCHAR(50),
    Ort VARCHAR(500),
    PLZ CHAR(5),
    PRIMARY KEY (AdresseID)
)

Das Schlüsselwort AUTO_INCREMENT darf pro Tabelle nur einmal verwendet werden.

Fremdschlüsseldefinition mit FOREIGN KEY

Die Definition von Fremdschlüsseln einer Tabelle erfolgt mit dem SQL-Schlüsselwort FOREIGN KEY und der Angabe einer Tabellenspalte einer anderen Tabelle, deren Werte als Fremdschlüssel genutzt werden sollen. Das folgende Beispiel erzeugt eine Tabelle 'Adresse' mit dem Fremdschlüssel KundeID:

SQL-Statement
CREATE TABLE Adresse (
    AdresseID INTEGER AUTO_INCREMENT,
    Strasse VARCHAR(500),
    Hausnummer VARCHAR(50),
    Ort VARCHAR(500),
    PLZ CHAR(5),
    PRIMARY KEY (AdresseID),
    KundeID INTEGER NOT NULL,
    FOREIGN KEY (KundeID) REFERENCES Kunde(KundeID)
)

Es wird dabei zunächst eine weitere Spalte mit dem Namen KundeID angelegt. Anschließend wird mit dem FOREIGN KEY-Statement definiert, dass die Werte in der Spalte KundeID Fremdschlüssel sind und auf die Spalte KundeID der Tabelle Kunde verweisen.

Ergebnis
Adresse
AdresseID Strasse Hausnummer Ort PLZ KundeID
(FK, Kunde -> KundeID)
           

Die damit etablierte Fremdschlüsselbeziehung zwischen Kunde und Adresse entspricht einer in der folgenden Abbildung gezeigten 1:CN-Beziehung zwischen den beiden Tabellen.
Abbildung: Beispiel für Fremdschlüssel

Auch bei Fremdschlüsselattributen können mit den Schlüsselwörtern UNIQUE und NOT NULL die Eindeutigkeit aller Werte dieses Attributes beziehungsweise das Verbot von NULL-Werten erzwungen werden. Auf diese Weise lassen sich 1:1- und 1:N-Beziehungen umsetzen.

Erhaltung der referentiellen Integrität
Sobald eine Fremdschlüsselbeziehung etabliert wurde, ist eine logische Abhängigkeit der referenzierenden in die referenzierte Tabelle hergestellt. Diese Abhängigkeiten müssen beim Aktualisieren und Löschen von Datensätzen der referenzierten Tabelle dahingehend berücksichtigt werden, dass die referentielle Integrität erhalten bleibt. Bei der Definition eines Fremdschlüssels kann daher zusätzlich noch mit angegeben werden, wie das DBMS im Fall einer Änderung an der referenzierten Tabelle reagiert. Dazu werden die Schlüsselwörter ON UPDATE sowie ON DELETE wie im folgenden Beispiel eingesetzt.

SQL-Statement
CREATE TABLE Adresse (
    AdresseID INTEGER AUTO_INCREMENT,
    [...],
    KundeID INTEGER NOT NULL,
    FOREIGN KEY (KundeID) REFERENCES Kunde(KundeID)
        ON DELETE CASCADE ON UPDATE CASCADE
)

Zu Änderungen kann eine andere Reaktion als beim Löschen festgelegt werden. Das Verhalten beim Ändern des referenzierten Datensatzes wird mit dem Schlüsselwort ON UPDATE festgelegt, das Verhalten beim Löschen mit dem Schlüsselwort ON DELETE. Die möglichen Aktionen, die SQL zur Erhaltung der referentiellen Integrität vorsieht, sind in der folgenden Tabelle beschrieben. Die konkrete Implementierung ist jedoch wie auch bei den Datentypen herstellerabhängig.

Erhaltung der referentiellen Integrität
Aktion Schlüsselwort Beschreibung
Automatisches Übernehmen der Änderungen CASCADE Wird der referenzierte Datensatz geändert oder gelöscht, wird der
referenzierenden Datensatz automatisch mit geändert oder gelöscht.
Fremdschlüssel auf NULL-Wert setzen SET NULL Im Falle einer Änderung oder Löschung wird der Wert des
Fremdschlüsselattributs der referenzierenden Tabelle auf NULL gesetzt.
Dafür darf das Fremdschlüsselattribut allerdings nicht als NOT NULL
definiert sein.
Löschungen bzw. Änderungen an der
referenzierten Tabelle verbieten
RESTRICT Löschungen (ON DELETE) bzw. Änderungen (ON UPDATE) an der
referenzierten Tabelle werden vom DBMS verboten, d.h. nicht
durchgeführt.
Hinweis: Ist in MySQL 5.7 der Defaultwert für ON UPDATE und
ON DELETE.
Keine Änderungen an der referenzierenden
Tabelle
NO ACTION Ist zwar im SQL-Standard vorgesehen, würde jedoch die referentielle
Integrität stören.
Hinweis: Verhält sich in MySQL 5.7 wie RESTRICT.
Rücksetzen auf Defaultwert SET DEFAULT Setzt den Fremdschlüssel auf einen vorgegebenen Defaultwert.
Hinweis: Ist in MySQL 5.7 nicht implementiert.

Fachliche Integritätsbedingungen mit CHECK

Mit dem SQL-Schlüsselwort CHECK können zu Spalten einer Tabelle Bedingungen formuliert werden, die vor dem Ändern der Daten in der Datenbank geprüft werden. Auf diese Weise kann vor dem Eintragen eines Datensatzes in die Datenbank die Einhaltung bestimmter fachlicher Bedingungen zugesichert werden. Das folgende Beispiel prüft beispielsweise, ob der Wert in Beginnaktion vor dem Wert in Endeaktion liegt.

SQL-Statement
CREATE TABLE Gutscheinaktion (
    AktionID INTEGER AUTO_INCREMENT,
    Beginnaktion DATE,
    Endeaktion DATE,
    Gutscheincode CHAR(8),
    PRIMARY KEY (AktionID),
    CHECK (Beginnaktion < Endeaktion)
)

Hinweis
Das DBMS MariaDB unterstützt mit CHECK formulierte Bedingungen nicht.