Die Data Definition Language (kurz DDL) ist Teil von SQL. Die DDL wird eingesetzt, um Datenschema in Datenbanken zu beschreiben, zu ändern oder zu entfernen. Das Erstellen von Tabellen mit Hilfe der DDL ist der letzte Schritt im Datenbankenentwicklungsprozess.
Alle Datenbank-Tabellen befinden sich in einem Schema. Dieses Schema repräsentiert die Datenbank an sich. Bevor Tabellen angelegt werden können, muss ein Schema vorhanden sein. Ein Schema kann mit
CREATE SCHEMA <Schema-Name>
erstellt werden. Hier ein Beispiel:
CREATE SCHEMA friseur;
In einem DBMS können mehrere Schemas verwaltet werden. Daher ist sicherzustellen, dass sich alle Anweisungen der SQL eindeutig auf ein Schema beziehen lassen. Das DBMS kann sonst die angesprochenen Tabellen nicht identifizieren. Der Bezug zu einem Schema ergibt sich aus:
Schemaname.Tabellenname
Das Schema friseur verwaltet alle Salons. Eine Tabelle Salon lässt sich also über friseur.salon ansprechen.
Tabellen stellen die Grundstruktur für die Speicherung von Daten in der Datenbank dar. Viele Datenbankmanagementsysteme (DBMS) bieten Tools, um die Erstellung von Tabellen ohne die Programmierung von SQL-Skripten zu ermöglichen.
Die SQL-Syntax für den Befehl CREATE TABLE sieht folgendermaßen aus:
CREATE TABLE <Tabellen_Name>(<Spalte 1> <Datentyp_für_Spalte_1>, <Spalte 2> <Datentyp_für_Spalte_2>,... );
Beispiel
Das Erstellen von Tabellen wird anhand des Beispiels Mitarbeiter und Salon verdeutlicht.
Zur Erstellung einer Mitarbeitertabelle würden wir also eingeben:
CREATE TABLE mitarbeiter(idmitarbeiter INT, nachname VARCHAR(45),vorname VARCHAR(45))
Zur Erstellung einer Salontabelle würden wir also eingeben:
CREATE TABLE salon(idsalon INT, name VARCHAR(45))
CONSTRAINT heißt übersetzt "Zwang" oder "Einschränkung". Ein CONSTRAINT ist eine Bedingung, der ein Datensatz entsprechen muss. Wenn eine der aktuell gültigen Bedingungen verletzt wird, wird der betreffende Datensatz nicht gespeichert. Hier durch soll die Datenkonsistenz gewährleistet werden. Die unten vorgestellten Befehle PRIMARY KEY, FOREIGN KEY, NOT NULL und UNIQUE fallen in die Kategorie CONSTRAINT.
Nach der Attributliste wird das Schlüsselwort CONSTRAINT gesetzt. Das Schlüsselwort CONSTRAINT selbst ist nicht immer erforderlich bei der Verwendung der Einschränkungen PRIMARY KEY, FOREIGN KEY und UNIQUE. Im folgenden wird die Syntax so vermittelt, dass sie sowohl auf MS Access und MySQL anwendbar ist.
Es gibt drei Varianten, um die Entitätsintegrität mit Hilfe des Primärschlüssels zu definieren:
1. Möchte man einen Primärschlüssel festlegen, sind die Schlüsselworte PRIMARY KEY in die Attributliste aufzunehmen. Dann folgt der Spaltenname des Primärschlüssels in runden Klammern:
CREATE TABLE mitarbeiter(idmitarbeiter INT, nachname VARCHAR(45),vorname VARCHAR(45),
PRIMARY KEY (idmitarbeiter))
2. Alternativ kann der Primärschlüssel auch direkt in der Attributliste nach dem Datentypen kenntlich gemacht werden.
CREATE TABLE mitarbeiter(idmitarbeiter INT PRIMARY KEY, nachname VARCHAR(45),vorname VARCHAR(45))
3. Des weiteren besteht die Möglichkeit mit dem Schlüsselwort CONSTRAINT zu arbeiten. Nach der Attributliste folgt ein Komma und das Schlüsselwort CONSTRAINT. Dann ist noch ein Name für Constraint zu vergeben (im Beispiel pk für primary key) .
CREATE TABLE mitarbeiter(idmitarbeiter INT, nachname VARCHAR(45),vorname VARCHAR(45),fksalon INT, Constraint pk PRIMARY KEY (idmitarbeiter))
Mit einem Fremdschlüssel kann eine Spalte der einen Tabelle mit einer gleichartigen Spalte der anderen Tabelle verbunden werden. Um Datenkonsistenz (ins besondere referenzielle Integrität) sicherzustellen, sollte diese Spalte ein Primärschlüssel sein. Damit dies funktioniert, müssen beide Spalten den selben Datentyp besitzen.
Möchten man einen Fremdschlüssel festlegen, muss ein Constraint definiert werden. Wie beim Primärschlüssel folgt der Attributliste ein Komma und dann das Schlüsselwort CONSTRAINT. Nun ist noch ein Name für Constraint zu vergeben (im Beispiel fk für foreign key). Dann folgt die Fremdschlüsselspalte der zu erstellenden Tabelle in runden Klammern. Nun ist das Schlüsselwort REFERENCES anzugeben. Es folgt der Tabellenname der referenzierten Tabelle und die Zielspalte dieser Tabelle ebenfalls wieder in runden Klammern.
Zu beachten ist, dass beim Einsatz von Fremdschlüsseln, die Tabelle, auf die man sich bezieht schon existiert. In unserem Fall muss erst die Tabelle Salon bestehen, bevor man sich in der Tabelle Mitarbeiter, darauf beziehen kann. Umgekehrt kann man erst die Tabelle Salon löschen, wenn die Tabelle Mitarbeiter gelöscht wurde, bzw. der Fremdschlüssel in dieser Tabelle.
Zur Erstellung einer verbesserten Mitarbeitertabelle würden wir also eingeben:
CREATE TABLE mitarbeiter(idmitarbeiter INT, nachname VARCHAR(45),vorname VARCHAR(45),fksalon INT, Constraint pk PRIMARY KEY (idmitarbeiter), Constraint fk FOREIGN KEY (fksalon ) REFERENCES salon(idsalon))
Die Optionen eines FOREIGN KEY bestimmen das Verhalten der Tabelle, die die Verweise (Fremdschlüssel) benutzt – also der Detailtabelle –, sobald in der Primärtabelle die Primärschlüssel geändert werden. Im folgenden wird folgendes Verhalten näher beschrieben:
NO ACTION – alle Änderungen werden verweigert
CASCADE – die Weitergabe der Änderung an die Detailtabelle
RESTRICT – die Verweigerung der Änderung auch in der Primärtabelle
SET NULL – die Änderung des Verweises in der Detailtabelle auf NULL
Die folgenden Optionen wirken sich bei Änderungen und Löschungen in der Primärtabelle in gleicher Weise aus:
ON UPDATE NO ACTION und ON DELETE NO ACTION
Die „Inaktivität“ bedeutet: Wenn ein Primärschlüssel in der Primärtabelle geändert bzw. gelöscht werden soll und abhängige Sätze in der Detailtabelle existieren, dann wird die Änderung/Löschung mit einem Fehler abgebrochen; es erfolgt ein ROLLBACK.
ON UPDATE RESTRICT und ON DELETE RESTRICT
Die „Restriktion der Aktualisierung“ bedeutet: Wenn ein Primärschlüssel in der Primärtabelle geändert bzw. gelöscht werden soll und abhängige Sätze in der Detailtabelle existieren, dann wird die Änderung/Löschung verweigert.
ON UPDATE SET NULL und ON DELETE SET NULL
Das „NULL-Setzen“ bedeutet: Wenn ein Primärschlüssel in der Primärtabelle geändert bzw. gelöscht wird, dann werden die Verweise in der Detailtabelle auf NULL gesetzt. Das ist nur möglich, wenn die betreffende Spalte NULL-Werte zulässt (also nicht mit NOT NULL definiert wurde).
Die folgende Option wirkt sich bei Änderungen und Löschungen unterschiedlich aus:
ON UPDATE CASCADE also bei Änderungen
Mit der „Weitergabe der Aktualisierung“ werden die Fremdschlüssel in der Detailtabelle in der gleichen Weise geändert, wie der Primärschlüssel in der Primärtabelle geändert wird.
ON DELETE CASCADE also bei Löschungen
Die „Löschweitergabe“ bedeutet: Zusammen mit dem Datensatz in der Primärtabelle werden auch alle Datensätze in der Detailtabelle gelöscht, die sich auf diesen Schlüssel beziehen.
Wenn der Primärschlüssel „richtig“ definiert ist, nämlich für alle Zeiten unveränderlich ist, dann wäre die UPDATE-Option eigentlich überflüssig. Aber man sollte vorbereitet sein, falls man doch auf die Idee kommt, einen Primary Key zu ändern.
Änderungen in der Detailtabelle werden durch einen FK wie folgt eingeschränkt: Bei INSERT und UPDATE dürfen in den Spalten des Fremdschlüssels nur solche Werte eingefügt werden, die in der Primärtabelle als Primärschlüssel vorhanden sind. Einzige Ausnahme ist, wenn die Fremdschlüssel-Spalte als optional definiert ist. Dann kann hier auch NULL eingefügt werden, obwohl NULL niemals als Primärschlüssel in der Primärtabelle stehen wird.
Die Schlüsselwörter NULL bzw. NOT NULL legen ausdrücklich fest, ob NULL-Werte in der Spalte zulässig sind oder nicht. Der Standardwert ist „zulässig“, das NULL kann deshalb entfallen. Die Schlüsselwerte werden nach dem Datentypen in die Attributeliste eingetragen. Um sicherzustellen das Primärschlüssel vergeben werden, ist es sinnvoll für Primärschlüssel-Spalten NULL-Werte zu unterbinden.
Alternativ kann für jede NOT NULL Einschränkung eine eigenes CONSTRAINT mit entsprechenden Namen definiert werden.
Beispiel
Zur Erstellung einer verbesserten Mitarbeitertabelle könnten wir also eingeben:
CREATE TABLE mitarbeiter(idmitarbeiter INT NOT NULL, nachname VARCHAR(45),vorname VARCHAR(45),fksalon INT NOT NULL, Constraint pk PRIMARY KEY (idmitarbeiter), Constraint fk FOREIGN KEY (fksalon ) REFERENCES salon(idsalon))
Das Schlüsselwort AUTOINCREMENT legt fest, dass die Werte in dieser Spalte automatisch vom DBMS hochgezählt werden. Hierdurch wird sichergestellt, das Werte eines Primärschlüssels wirklich eindeutig sind. Schlüsselwort AUTOINCREMENT wird nach dem Spaltennamen der hochzuzählenden Spalte aufgeführt.
Für Access ist das Schlüsselwort AUTOINCREMENT zu verwenden. Außerdem wird in Access AUTOINCREMENT wie ein Datentyp behandelt.
Beispiel
Zur Erstellung einer verbesserten Mitarbeitertabelle könnten wir also für Access eingeben:
CREATE TABLE Salon(idSalon AUTOINCREMENT, name VARCHAR(45),gruendung Date, Constraint pk PRIMARY KEY (idSalon))
In MySQL muss man folgendes angeben:
CREATE TABLE Salon(idSalon int AUTOINCREMENT, name VARCHAR(45),gruendung Date, Constraint pk PRIMARY KEY (idSalon))
Mit Schlüsselwort DEFAULT wird ein Standardwert je Spalte festgelegt (als konstanter Wert oder als Ergebnis einer Funktion). Der Standardwert muss kompatibel zum Datentyp der Spalte sein und wird immer dann verwendet, wenn bei einem neuen Datensatz für diese Spalte kein Wert angegeben ist. Die Default-Wert-Vergabe wird in Access in DDL nicht ohneweiteres unterstützt!
Alternativ können auch hier für jede Einschränkung eigene Constraints mit entsprechenden Namen definiert werden.
Beispiel
Zur Erstellung einer verbesserten Mitarbeitertabelle könnten wir also eingeben:
CREATE TABLE mitarbeiter(idmitarbeiter INT NOT NULL AUTOINCREMENT, nachname VARCHAR(45),vorname VARCHAR(45),fksalon INT NOT NULL DEFAULT 1 PRIMARY KEY (idmitarbeiter), FOREIGN KEY (idsalon ) REFERENCES salon (idsalon))
Das Schlüsselwort UNIQUE sorgt dafür, dass innerhalb einer Spalte bzw. einer Kombination von Spalten kein Wert doppelt auftreten kann. Das Schlüsselwort kann nach dem Datentyp der Spalte aufgeführt werden, für die es gültig sein soll. Alternativ kann UNIQUE in einem eigenen CONSTRAINT definiert werden.
Beispiel
Hier wurden drei Constraints ausgelagert. Sie tagen die Namen pkmitarbeiter, fksalon und nachnameIndex.
Für Access muss das Beispiel hinsichtlich Autoincrement und Default-Wert-Vergabe angepasst werden!
CREATE TABLE mitarbeiter(idmitarbeiter INT NOT NULL AUTOINCREMENT, nachname VARCHAR(45),vorname VARCHAR(45) ,fksalon INT NOT NULL DEFAULT 1, CONSTRAINT pkmitarbeiter PRIMARY KEY (idmitarbeiter), CONSTRAINT fksalon FOREIGN KEY (fksalon ) REFERENCES salon (idsalon), CONSTRAINT nachnameIndex UNIQUE (nachname))
ALTER TABLE ermöglicht das Ändern der Struktur einer vorhandenen Tabelle. Es können beispielsweise Spalten oder Constrains hinzufügen oder entfernt werden. Die Typen vorhandener Spalten können ebenfalls geändert werden. Spalten oder Tabellen lassen sich umbenennen.
Alle zuvor durch die CREATE TABLE Anweisung festgelegten Bestandteile können durch die Änderungsoperatoren
ADD
DROP
MODIFY
RENAME
angepasst werden. Die Schlüsselwörter ALTER TABLE stehen zu Beginn. Dann folgt der Name der zu ändernden Tabelle. Es folgen die Änderungsoperatoren und die zu ändernden Bestandteile der Tabelle. Die unterschiedlichen Kombinationsmöglichkeiten können der MySQL-Spezifikation entnommen werden.
Hier wird eine Tabelle Salon in Filiale umbenannt:
ALTER TABLE Salon RENAME TO Filiale;
Hier wird einer bestehenden Tabelle Mitarbeiter eine Spalte istWeiblich hinzugefügt.
ALTER TABLE Mitarbeiter ADD (istWeiblich boolean);
Manchmal ist es wünschenswert eine Tabelle aus welchem Grund auch immer aus der Datenbank zu löschen. Gelöscht werden kann eine Tabelle mit dem Schlüsselwort DROP, anschließend muss der Tabellenname der Tabelle folgen, die gelöscht werden soll.Die Syntax für DROP TABLE lautet:
DROP TABLE "Tabellen_Name";
Abfragen können als so genannte Views in einer Datenbank gespeichert werden und sind unter einem eindeutigen Namen abrufbar.
Views werden mit dem Befehl CREATE VIEW mit folgender Syntax angelegt.
CREATE VIEW View-Name AS Select-Ausdruck ;
Die Schlüsselwörter CREATE VIEW kennzeichnen den Befehl. Unter View-Name ist eine Bezeichnung anzugeben, unter der die View in einem SELECT-Befehl angesprochen wird. Dieser Name muss eindeutig sein und darf auch kein Name einer „echten“ Tabelle sein. Als Select-Ausdruck wird ein (beliebiger) SELECT-Befehl eingetragen. Es wird empfohlen, möglichst bei allen Spalten mit einem Alias zu arbeiten. Diese können wahlweise vor dem AS in Klammern angegeben werden oder (wie üblich) Teil des Select-Ausdrucks sein. Die View wird dann wie jede Tabelle benutzt.
Beispiel
CREATE VIEW weiblicheMitarbeiter AS (SELECT vorname,nachname FROM mitarbeiter WHERE istWeiblich =true)