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.
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 |
INTEGERalternativ: 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 |
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.
|
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]
)
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, |
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, |
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', |
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, |
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.
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.

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. |
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.
|