Premium

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:

MySQL 8.1
USE datenbank_name;

Zum Anlegen einer Tabelle wird CREATE TABLE verwendet. Die Grundsyntax sieht so aus:

MySQL 8.1
CREATE TABLE [IF NOT EXISTS] tabellen_name (
     spalte_1 datentyp,
    [spalte_2 datentyp,]
    ...
    [spalte_n datentyp,]
);

Legen wir zum Beispiel eine Benutzertabelle an.

MySQL 8.1
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255),
    age INTEGER
);
MySQL 8.1
CREATE 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.1
CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18
);
MySQL 8.1
CREATE 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.1
CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
MySQL 8.1
CREATE 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.1
DESCRIBE Users;
FieldTypeNullKeyDefaultExtra
idintNOPRINULLauto_increment
namevarchar(255)NONULL
ageintNO18

Um die Struktur einer angelegten Tabelle anzuschauen, kannst du eine SQL-Query gegen das Informationsschema absetzen:

MySQL 8.1
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = current_schema() AND table_name = 'users';
column_namedata_typeis_nullablecolumn_default
idintegerNOnextval('users_id_seq'::regclass)
namecharacter varyingNO<NULL>
ageintegerNO18

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_1>, <spalte_n>) ergänzt:

    MySQL 8.1
    CREATE 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_1>, <spalte_n>) ergänzt:

    MySQL 8.1
    CREATE 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.1
    CREATE 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.1
    CREATE 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:

    MySQL 8.1
    FOREIGN KEY (<spalte_1>, <spalte_n>)
    REFERENCES <externe_tabelle> (<spalte_in_externer_tabelle_1>, <spalte_in_externer_tabelle_n>)
    [ON DELETE aktion]
    [ON UPDATE aktion]
    

    Die vollständige Query mit Foreign Key sieht so aus:

    MySQL 8.1
    CREATE 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.1
    CREATE 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.1
    Cannot 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.1
    CREATE 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.1
    CREATE 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:

    MySQL 8.1
    FOREIGN KEY (<spalte_1>, <spalte_n>)
    REFERENCES <externe_tabelle> (<spalte_in_externer_tabelle_1>, <spalte_in_externer_tabelle_n>)
    [ON DELETE aktion]
    [ON UPDATE aktion]
    

    Die vollständige Query mit Foreign Key sieht so aus:

    MySQL 8.1
    CREATE 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.1
    CREATE 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.1
    ERROR:  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.

MySQL 8.1
DROP TABLE [IF EXISTS] tabellen_name;

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 768 Pixeln benötigt. Öffne diese Seite auf einem Computer oder Tablet.