Skript: Datenbanken und SQL mit der Warenautomat-Datenbank
7. SQL Struktur und CREATE TABLE
Bevor wir Tabellen anlegen, ist ein kurzer Überblick über die wichtigsten Bestandteile von SQL sinnvoll. SQL-Befehle werden in Kategorien eingeteilt:
DDL(Data Definition Language): Definiert die Struktur der Datenbank, z. B.CREATE,ALTER,DROP.DML(Data Manipulation Language): Verändert Dateninhalte, z. B.INSERT,UPDATE,DELETE.DQL(Data Query Language): Liest Daten aus, vor allem mitSELECT.DCL(Data Control Language): Steuert Zugriffsrechte, z. B.GRANT,REVOKE.
CREATE TABLE gehört damit zur DDL, weil hier die Tabellenstruktur festgelegt wird.
7.1 Tabellen anlegen
Mit CREATE TABLE wird ein Modell technisch in eine echte Datenbanktabelle umgesetzt. Dabei werden Spalten, Datentypen und Constraints definiert.
Wichtig für den Arbeitsablauf:
- Zuerst entsteht das ER-Modell (inhaltliche Sicht mit Entitäten und Beziehungen).
- Danach folgt die relationale Schreibweise (formale Sicht auf Relationen und Attribute).
- Erst dann wird mit
CREATE TABLEtechnisch implementiert.
Die relationale Schreibweise ist also der Zwischenschritt zwischen ER-Modell und CREATE TABLE.
Typischer Übergang:
- ER-Modell: Entität
PRODUKT, Beziehung zuLIEFERANT
erDiagram
LIEFERANT ||--|{ PRODUKT : liefert
LIEFERANT {
BIGINT lieferant_id PK
VARCHAR name
VARCHAR email
BOOLEAN aktiv
}
PRODUKT {
BIGINT produkt_id PK
VARCHAR name
NUMERIC preis_eur
BIGINT lieferant_id FK
BOOLEAN aktiv
}
- Relationale Schreibweise:
PRODUKT(produkt_id, name, preis_eur, lieferant_id, aktiv) - SQL-Umsetzung:
CREATE TABLE produkt (...)mit PK/FK und Constraints
Vorüberlegungen vor dem Schreiben von SQL:
- Welche Entität wird modelliert und wo liegt ihre Grenze?
- Welche Attribute sind Pflichtfelder (
NOT NULL)? - Welcher Primärschlüssel passt (
INT,BIGINT,UUID)? - Welche Werte müssen eindeutig sein (
UNIQUE), z. B. Seriennummer oder E-Mail? - Welche Regeln müssen geprüft werden (
CHECK), z. B. Preis > 0? - Welche Beziehungen werden über Fremdschlüssel (
FOREIGN KEY) abgesichert? - Welche Standardwerte sind sinnvoll (
DEFAULT), z. B.aktiv = TRUE?
7.2 Constraints direkt beim Erstellen
Constraints sorgen dafür, dass Regeln schon auf Tabellenebene gelten. Dadurch werden Fehler früh verhindert und die Daten bleiben konsistent.
Wichtige Constraints im Überblick:
PRIMARY KEY: Eindeutige Identifikation jeder Zeile.FOREIGN KEY: Verknüpfung zu einer anderen Tabelle.NOT NULL: Pflichtfeld.UNIQUE: Keine doppelten Werte.CHECK: Inhaltliche Werteprüfung.DEFAULT: Standardwert, falls kein Wert angegeben wird.
7.3 Vollständiges Beispiel: Tabelle mit allen zentralen Regeln
Im folgenden Beispiel enthält eine Tabelle alle wichtigen Elemente in einem Block: PK, FK, NOT NULL, UNIQUE, CHECK und DEFAULT.
CREATE TABLE produkt (
produkt_id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(150) NOT NULL,
preis_eur NUMERIC(8,2) NOT NULL,
barcode VARCHAR(30) UNIQUE,
kategorie VARCHAR(60) NOT NULL DEFAULT 'SNACK',
aktiv BOOLEAN NOT NULL DEFAULT TRUE,
lieferant_id BIGINT NOT NULL REFERENCES lieferant(lieferant_id),
CONSTRAINT ck_produkt_preis CHECK (preis_eur > 0),
CONSTRAINT ck_produkt_kategorie CHECK (kategorie IN ('SNACK', 'GETRAENK', 'HYGIENE'))
);
[!NOTE] Kurzerklärungen zum Beispiel:
produkt_id: Primärschlüssel (PK), eindeutige Identifikation.lieferant_id: Fremdschlüssel (FK) auflieferant.name,preis_eur,kategorie,aktiv,lieferant_id: Pflichtfelder (NOT NULL).barcode: Darf nicht doppelt vorkommen (UNIQUE).preis_eur > 0: Negative oder null Preise werden verhindert (CHECK).kategorieundaktiv: Sinnvolle Startwerte überDEFAULT.
Querverweise
Übungen zum Kapitel
Übung 1: Erstelle eine Tabelle filiale mit einer ID, einem Namen und einer aktiven Kennung.
Lösung
**Lösung:** ```sql CREATE TABLE filiale ( filiale_id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(120) NOT NULL, aktiv BOOLEAN NOT NULL DEFAULT TRUE ); ```Übung 2: Erstelle eine Tabelle produkt_kurz mit einer Preisprüfung preis_eur > 0.
Lösung
**Lösung:** ```sql CREATE TABLE produkt_kurz ( produkt_id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(150) NOT NULL, preis_eur NUMERIC(8,2) NOT NULL, CONSTRAINT ck_preis CHECK (preis_eur > 0) ); ```Übung 3: Nenne den Zwischenschritt zwischen ER-Modell und CREATE TABLE und begründe kurz, warum er wichtig ist.
Lösung
**Lösung:** Die relationale Schreibweise. Sie übersetzt das inhaltliche ER-Modell in eine formale Tabellenstruktur und macht vor dem SQL klar, welche Attribute, Schlüssel und Beziehungen umgesetzt werden müssen. **Lösung:** Die relationale Schreibweise. Sie übersetzt das inhaltliche ER-Modell in eine formale Tabellenstruktur und macht vor dem SQL klar, welche Attribute, Schlüssel und Beziehungen umgesetzt werden müssen.Übung 4: Markiere im Beispiel aus 6.3 jeweils PK, FK, UNIQUE, CHECK und DEFAULT.