CREATE TABLE legt in SQL eine neue Tabelle mit ihren Spalten, Datentypen und Regeln an. Es gehört zur DDL (Data Definition Language) und ist der erste Schritt jedes Datenbank-Schemas: Erst muss die Struktur stehen, dann können INSERT-Befehle Daten hineinschreiben.
Grundaufbau
Jede Spalte bekommt einen Namen, einen Datentyp und optional Regeln. Das Komma trennt die Spaltendefinitionen, der Strichpunkt beendet das Statement:
CREATE TABLE kunden (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
geburtsdatum DATE,
anmeldedatum TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Wer dieselbe Aufgabe in SQL Server, PostgreSQL oder Oracle lösen will, deklariert eine IDENTITY-Spalte statt einer AUTO_INCREMENT-Spalte.
Die wichtigsten Regeln (Constraints)
- PRIMARY KEY: eindeutige Identifikation jeder Zeile, nie NULL – Details bei Primär- und Fremdschlüssel
- NOT NULL: Pflichtfeld, kein leerer Wert erlaubt – siehe NOT NULL-Constraint
- UNIQUE: kein Wert darf doppelt vorkommen – siehe UNIQUE-Constraint
- DEFAULT: automatischer Wert, wenn die Spalte beim Einfügen fehlt
- CHECK: Bedingung, die jeder Wert erfüllen muss – siehe CHECK-Constraint
- FOREIGN KEY: Verweis auf eine Zeile einer anderen Tabelle
Datentypen wählen
Grobe Orientierung: INT für ganze Zahlen, DECIMAL(p,s) für Geldbeträge, VARCHAR(n) für kurze Texte, TEXT für lange Texte, DATE/TIMESTAMP für Zeitpunkte, BOOLEAN für Ja/Nein. Zu große Typen verschwenden Speicher, zu kleine brechen später – der Datenbankschema-Artikel erklärt das Zusammenspiel mit Indizes und Datenmodellen.
Variante: CREATE TABLE AS
Mit CREATE TABLE kopie AS SELECT ... entsteht eine neue Tabelle direkt aus einem Abfrageergebnis – praktisch für Staging-Tabellen oder Backups. Die Datentypen werden aus den Ergebnisspalten übernommen, Constraints wie PRIMARY KEY gehen dabei meist verloren.
Fallstricke
- Doppelte Tabellennamen:
CREATE TABLE kundenschlägt fehl, wenn die Tabelle existiert.CREATE TABLE IF NOT EXISTS kunden ...unterdrückt den Fehler. - Reihenfolge der Fremdschlüssel: Die Zieltabelle muss vorher existieren, sonst gibt es einen Fehler.
- DDL ist nicht überall zurücksetzbar: In MySQL/MariaDB löst CREATE TABLE einen impliziten Commit aus und lässt sich nicht in einer Transaktion zurückrollen – in PostgreSQL schon.
- Reservierte Wörter: Namen wie
orderoderusermüssen je nach Datenbank in Backticks bzw. Anführungszeichen gesetzt werden.
Wer die Struktur später ändert, nutzt ALTER TABLE; wer sie komplett entfernt, DROP TABLE. Die drei Befehle bilden zusammen das Grundgerüst jeder Schema-Verwaltung – von der ersten Tabelle bis zur Migration.