Tabellen erstellen und löschen
Tabelle erstellen
Bevor du eine Tabelle anlegst, musst du die Datenbank wählen, in der die Tabelle gespeichert werden soll. Das geht mit USE:
USE datenbank_name;- datenbank_name
- Die Datenbank, in der die Tabellen angelegt werden.
Zum Anlegen einer Tabelle wird CREATE TABLE verwendet. Die Grundsyntax sieht so aus:
CREATE TABLE [IF NOT EXISTS] tabellen_name (
spalte datentyp [, ...]
);- [ ]optionaler Teil
- ...kann wiederholt werden
- IF NOT EXISTS
Die Tabelle wird nicht angelegt, wenn es schon eine Tabelle mit diesem Namen gibt. Ohne diesen Teil bricht die Query in diesem Fall mit einem Fehler ab.
SchlüsselwortOptional- tabellen_name
- Der Name der neuen Tabelle.
- spalte
Der Name der Spalte. Du kannst mehrere Paare spalte datentyp durch Kommas getrennt angeben.
- datentyp
Welche Werte die Spalte speichert, zum Beispiel INTEGER für Zahlen oder VARCHAR(255) für Strings.
Legen wir zum Beispiel eine Benutzertabelle an.
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255), age INTEGER );
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255), age INTEGER );
INTEGER und VARCHAR(255) sind Datentypen: ein numerischer und ein String-Typ. Mehr dazu in den folgenden Artikeln.
INTEGER und VARCHAR(255) sind Datentypen: ein numerischer und ein String-Typ. Mehr dazu in den folgenden Artikeln.
Zusätzliche Parameter bei der Spaltendefinition
Die obige Spaltendefinition ist eine vereinfachte Form. Neben Spaltenname und Datentyp können noch folgende optionale Parameter ergänzt werden:
-
PRIMARY KEY
Markiert eine Spalte oder eine Spaltengruppe als Primary Key.
-
AUTO_INCREMENT
Gibt an, dass der Wert dieser Spalte beim Einfügen neuer Datensätze automatisch hochgezählt wird. Jede Tabelle kann höchstens eine AUTO_INCREMENT-Spalte haben. Hinweis: Dieser Parameter ist nur für Ganzzahl- und Gleitkommatypen erlaubt.
-
SERIAL oder GENERATED ALWAYS AS IDENTITY
Gibt an, dass der Wert dieser Spalte beim Einfügen neuer Datensätze automatisch hochgezählt wird. SERIAL ist die Kurzform, um ein Autoinkrement-Feld anzulegen.
-
UNIQUE
Stellt sicher, dass die Werte in dieser Spalte über alle Datensätze hinweg unterschiedlich sind.
-
NOT NULL
Stellt sicher, dass die Werte in dieser Spalte nicht NULL sein dürfen.
-
DEFAULT
Legt einen Standardwert fest.
Für unsere Users-Tabelle könnten wir folgende Parameter setzen:
MySQL 8.4CREATE TABLE Users ( id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18 );
MySQL 8.4CREATE TABLE Users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18 );
In diesem Beispiel ist:
- id ein numerisches Feld, das den Primary Key mit Autoinkrement bildet;
- id ein Feld vom Typ SERIAL (autoinkrementierende Ganzzahl), das den Primary Key bildet;
- name ein String-Feld mit maximal 255 Zeichen und Pflichtangabe;
- age ein numerisches Feld mit Standardwert 18.
CURRENT_TIMESTAMP als Standardwert
CURRENT_TIMESTAMP ist praktisch, wenn der Zeitpunkt der Datensatzerstellung automatisch festgehalten werden soll. Zum Beispiel zusammen mit dem Typ TIMESTAMP.
MySQL 8.4CREATE TABLE Users ( id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
MySQL 8.4CREATE TABLE Users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Tabellenbeschreibung
Um die Struktur einer angelegten Tabelle anzuschauen, gibt es den DESCRIBE-Operator.
MySQL 8.4DESCRIBE Users;
Um die Struktur einer angelegten Tabelle anzuschauen, kannst du eine SQL-Query gegen das Informationsschema absetzen:
MySQL 8.4SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = 'users';
Weitere Parameter bei der Tabellendefinition
Neben der Spaltendefinition kannst du beim Anlegen einer Tabelle noch folgende Parameter angeben:
Primary Key
Wenn du den Primary Key nicht direkt bei den Spalteneigenschaften definierst, kannst du das auch in den Tabellen-Parametern tun, indem du nach der Spaltenliste PRIMARY KEY (spalte [, ...]) ergänzt:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, PRIMARY KEY (id) );
Primary Key
Wenn du den Primary Key nicht direkt bei den Spalteneigenschaften definierst, kannst du das auch in den Tabellen-Parametern tun, indem du nach der Spaltenliste PRIMARY KEY (spalte [, ...]) ergänzt:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, PRIMARY KEY (id) );
Foreign Keys
Angenommen, wir wollen speichern, in welcher Firma unsere Nutzer arbeiten. Legen wir eine kleine Tabelle Companies an, in der wir die eindeutige ID und den Namen der Firma speichern:
MySQL 8.4CREATE TABLE Companies ( id INTEGER, name VARCHAR(255) NOT NULL, PRIMARY KEY (id) );
Als Nächstes ergänzen wir in der Users-Tabelle das Feld company – den Arbeitsplatz unseres Nutzers, der auf einen Datensatz in Companies verweist. Die vollständige Query zum Anlegen der Tabelle sieht so aus:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id) );
Damit beim Einfügen neuer Datensätze in Users garantiert ist, dass die Spalte company eine ID enthält, die es in Companies wirklich gibt, wird ein Foreign Key verwendet. Seine Syntax:
FOREIGN KEY (spalte [, ...])
REFERENCES externe_tabelle (spalte_der_externen_tabelle [, ...])
[ON DELETE aktion]
[ON UPDATE aktion]- [ ]optionaler Teil
- ...kann wiederholt werden
- spalte
Die Spalte dieser Tabelle, die auf eine andere Tabelle verweist. Bei einem zusammengesetzten Schlüssel listest du die Spalten durch Kommas getrennt auf.
- externe_tabelle
Die Tabelle, auf deren Datensätze der Foreign Key verweist.
- spalte_der_externen_tabelle
Die Spalte der externen Tabelle, mit der die Werte abgeglichen werden, meist ihr Primary Key. Es sind genauso viele Spalten in derselben Reihenfolge wie in FOREIGN KEY.
- ON DELETE aktion
Was mit den Datensätzen dieser Tabelle passiert, wenn der Datensatz gelöscht wird, auf den sie verweisen.
OptionalRESTRICTCASCADESET NULLNO ACTION- ON UPDATE aktion
Was mit den Datensätzen dieser Tabelle passiert, wenn sich der Wert ändert, auf den sie verweisen.
OptionalRESTRICTCASCADESET NULLNO ACTION
Die vollständige Query mit Foreign Key sieht so aus:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id), FOREIGN KEY (company) REFERENCES Companies (id) );
Mit Foreign Keys kann man festlegen, wie sich der aktuelle Datensatz verhält, wenn der referenzierte Datensatz geändert oder gelöscht wird.
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id), FOREIGN KEY (company) REFERENCES Companies (id) ON DELETE RESTRICT ON UPDATE CASCADE );
ON DELETE RESTRICT bedeutet: Versucht jemand, eine Firma zu löschen, zu der es Einträge in Users gibt, lässt die Datenbank das nicht zu:
MySQL 8.4Cannot delete or update a parent row: a foreign key constraint fails
Wäre ON DELETE CASCADE angegeben, würden beim Löschen einer Firma auch alle Nutzer gelöscht, die auf diese Firma verweisen.
Es gibt noch eine Option: ON DELETE SET NULL. Damit setzt die Datenbank für alle Nutzer der gelöschten Firma das Feld company auf NULL.
ON UPDATE CASCADE bedeutet: Ändert eine Firma ihre ID, bekommen alle Nutzer (Users) automatisch die neue ID im Feld company.
Foreign Keys
Angenommen, wir wollen speichern, in welcher Firma unsere Nutzer arbeiten. Legen wir eine kleine Tabelle Companies an, in der wir die eindeutige ID und den Namen der Firma speichern:
MySQL 8.4CREATE TABLE Companies ( id INTEGER, name VARCHAR(255) NOT NULL, PRIMARY KEY (id) );
Als Nächstes ergänzen wir in der Users-Tabelle das Feld company – den Arbeitsplatz unseres Nutzers, der auf einen Datensatz in Companies verweist. Die vollständige Query zum Anlegen der Tabelle sieht so aus:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id) );
Damit beim Einfügen neuer Datensätze in Users garantiert ist, dass die Spalte company eine ID enthält, die es in Companies wirklich gibt, wird ein Foreign Key verwendet. Seine Syntax:
FOREIGN KEY (spalte [, ...])
REFERENCES externe_tabelle (spalte_der_externen_tabelle [, ...])
[ON DELETE aktion]
[ON UPDATE aktion]- [ ]optionaler Teil
- ...kann wiederholt werden
- spalte
Die Spalte dieser Tabelle, die auf eine andere Tabelle verweist. Bei einem zusammengesetzten Schlüssel listest du die Spalten durch Kommas getrennt auf.
- externe_tabelle
Die Tabelle, auf deren Datensätze der Foreign Key verweist.
- spalte_der_externen_tabelle
Die Spalte der externen Tabelle, mit der die Werte abgeglichen werden, meist ihr Primary Key. Es sind genauso viele Spalten in derselben Reihenfolge wie in FOREIGN KEY.
- ON DELETE aktion
Was mit den Datensätzen dieser Tabelle passiert, wenn der Datensatz gelöscht wird, auf den sie verweisen.
OptionalRESTRICTCASCADESET NULLSET DEFAULTNO ACTION- ON UPDATE aktion
Was mit den Datensätzen dieser Tabelle passiert, wenn sich der Wert ändert, auf den sie verweisen.
OptionalRESTRICTCASCADESET NULLSET DEFAULTNO ACTION
Die vollständige Query mit Foreign Key sieht so aus:
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id), FOREIGN KEY (company) REFERENCES Companies (id) );
Mit Foreign Keys kann man festlegen, wie sich der aktuelle Datensatz verhält, wenn der referenzierte Datensatz geändert oder gelöscht wird.
MySQL 8.4CREATE TABLE Users ( id INTEGER, name VARCHAR(255) NOT NULL, age INTEGER NOT NULL DEFAULT 18, company INTEGER, PRIMARY KEY (id), FOREIGN KEY (company) REFERENCES Companies (id) ON DELETE RESTRICT ON UPDATE CASCADE );
ON DELETE RESTRICT bedeutet: Versucht jemand, eine Firma zu löschen, zu der es Einträge in Users gibt, lässt die Datenbank das nicht zu:
MySQL 8.4ERROR: update or delete on table "companies" violates foreign key constraint "users_company_fkey" on table "users" DETAIL: Key (id)=(1) is still referenced from table "users".
Wäre ON DELETE CASCADE angegeben, würden beim Löschen einer Firma auch alle Nutzer gelöscht, die auf diese Firma verweisen.
Es gibt noch eine Option: ON DELETE SET NULL. Damit setzt die Datenbank für alle Nutzer der gelöschten Firma das Feld company auf NULL.
ON UPDATE CASCADE bedeutet: Ändert eine Firma ihre ID, bekommen alle Nutzer (Users) automatisch die neue ID im Feld company.
Tabelle löschen
Eine Tabelle löschst du mit DROP TABLE.
DROP TABLE [IF EXISTS] tabellen_name;- [ ]optionaler Teil
- IF EXISTS
Es gibt keinen Fehler, wenn keine Tabelle mit diesem Namen existiert.
SchlüsselwortOptional- tabellen_name
- Die Tabelle, die samt allen Daten gelöscht wird.
Interaktive Aufgabe
Jetzt, wo du die Grundlagen zum Anlegen von Tabellen kennst, kannst du das Gelernte in der interaktiven Aufgabe festigen:
Interaktive Übung nicht verfügbar
Für die interaktive Übung wird eine Bildschirmbreite von mindestens 600 Pixeln benötigt. Öffne diese Seite auf einem Computer oder Tablet.
Ziehe die Elemente aus der rechten Leiste in die Lücken der SQL-Abfrage, um die korrekte Users-Tabelle zu erstellen
Feldnamen:
Datentypen:
Constraints:
Anforderungen an die Tabelle:
- Feld id: Auto-Increment-Integer, Primärschlüssel
- Feld name: String bis 255 Zeichen, Pflichtfeld
- Feld age: Integer, Pflichtfeld, Standardwert 18