Workbenchy – Anleitung

Relationale Datenbanken (Jgst. 1, BPE6): Datenbank anlegen, Daten eintragen, Abfragen – mit Beispielen. Zur App

Überblick

Die App hat vier Arbeitsbereiche (oben auf der Seite):

  1. Datenbanken – Datenbanken anlegen, öffnen, umbenennen, löschen
  2. SQL-Konsole – SQL-Befehle ausführen (Tabellen anlegen, Daten eintragen, Abfragen), Skriptdateien importieren
  3. Tabellen und Daten – Daten ansehen, per Formular erfassen, ändern, löschen, exportieren
  4. Modell – relationale Datenmodelle (eERD) erstellen, ansehen und in die Datenbank bzw. aus der Datenbank übertragen (siehe Abschnitte 11 bis 13)

1. Erster Start

  1. Die Adresse in Chrome oder Edge öffnen.
  2. Beim ersten Laden lädt die App kurz die Datenbank-Engine (ein paar Sekunden). Danach funktioniert sie auch komplett offline.
  3. (Optional) Als App installieren: Browsermenü → „Workbenchy installieren“. Dann lässt sich die App wie ein normales Programm vom Startmenü starten.

2. Bedienung mit Tastatur und Screenreader

Alles in der App funktioniert ohne Maus:

Tasten-Bindungen
Taste Wirkung
Tab / Shift+Tab nächstes / vorheriges Feld oder Button
Tab / Shift+Tab im Codefenster der Modell-Ansicht Code um 4 Leerzeichen ein-/ausrücken (aktuelle Zeile oder Auswahl)
Esc im Codefenster der Modell-Ansicht zwischen Einrücken und normalem Tab-Fokussprung umschalten
Enter Button ausführen, Feld auslösen
Strg+Enter SQL-Befehle ausführen (im Textfeld der SQL-Konsole)

Im Codefenster der Modell-Ansicht ist Tab standardmäßig „gefangen“ (Einrücken). Nach jedem Klick in das Codefenster (oder Alt+1) wird das Einrücken automatisch wieder geschaltet und per Ansage bestätigt (Auto-Re-Arm); auch nach dem Zurück-Button (bfcache) gilt das wieder.

Mit NVDA/JAWS:

Der Fokus springt automatisch: nach einem Ansichtwechsel zur Überschrift der Ansicht, nach einem erfolgreich ausgeführten SQL-Befehl in die Ergebnis-Region.

3. Datenbank anlegen

  1. Im Bereich Datenbanken den Namen unter „Name der neuen Datenbank (Kleinschreibung)“ eingeben, z. B. msc_nfis (für die Aufgabe „Motorsportclub“).
  2. Button Anlegen → Bestätigung „Datenbank ‚msc_nfis' angelegt.“

Namensregeln: nur Kleinbuchstaben (a–z), Ziffern und _; der erste Buchstabe muss ein Buchstabe sein; maximal 64 Zeichen. Ein unzulässiger Name wird abgewiesen mit „Ungültiger Datenbankname: Bitte Kleinschreibung verwenden …“. Auf Mobilgeräten (Smartphone, Tablet) großschreibt die Tastatur dieses Eingabefeld nicht automatisch mit.

An der Datenbank selbst stehen die Buttons Öffnen, Umbenennen und Löschen (Löschen öffnet eine Bestätigungs-Abfrage, die die Konsequenz benennt).

4. Tabellen anlegen – Aufgabe 3.1 „Motorsportclub“

Das Relationenmodell (S. 15 des Handouts) wird in SQL übersetzt: pro Tabelle ein CREATE TABLE-Befehl. Die Pfeile (↑) werden zu FOREIGN KEY-Klauseln.

Das komplette Schema für die Workbenchy:

CREATE TABLE rennstrecke (
  streckennr INT PRIMARY KEY,
  streckenname VARCHAR(50) NOT NULL,
  streckenlaenge INT
) ENGINE=InnoDB;

CREATE TABLE teamleiter (
  teamleiternr INT PRIMARY KEY,
  vorname VARCHAR(50) NOT NULL,
  nachname VARCHAR(50) NOT NULL,
  email VARCHAR(50)
);

CREATE TABLE rennveranstaltung (
  veranstaltungsnr INT PRIMARY KEY,
  veranstaltungsdatum DATE NOT NULL,
  veranstaltungsname VARCHAR(50) NOT NULL,
  streckennr INT NOT NULL,
  FOREIGN KEY (streckennr) REFERENCES rennstrecke (streckennr)
);

CREATE TABLE teams (
  teamnr INT PRIMARY KEY,
  teambezeichnung VARCHAR(50) NOT NULL,
  teamleiternr INT NOT NULL,
  FOREIGN KEY (teamleiternr) REFERENCES teamleiter (teamleiternr)
);

CREATE TABLE teilnahmen (
  teilnahmenr INT PRIMARY KEY,
  teamplatzierung INT,
  veranstaltungsnr INT NOT NULL,
  teamnr INT NOT NULL,
  FOREIGN KEY (veranstaltungsnr) REFERENCES rennveranstaltung (veranstaltungsnr),
  FOREIGN KEY (teamnr) REFERENCES teams (teamnr)
);

CREATE TABLE mechaniker (
  mechanikernr INT PRIMARY KEY,
  vorname VARCHAR(50) NOT NULL,
  nachname VARCHAR(50) NOT NULL,
  telefon VARCHAR(50),
  teamnr INT NOT NULL,
  FOREIGN KEY (teamnr) REFERENCES teams (teamnr)
);

CREATE TABLE fahrer (
  fahrernr INT PRIMARY KEY,
  vorname VARCHAR(50) NOT NULL,
  nachname VARCHAR(50) NOT NULL,
  lizenznr VARCHAR(50) NOT NULL,
  teamnr INT NOT NULL,
  FOREIGN KEY (teamnr) REFERENCES teams (teamnr)
);

Begriffe:

Ausführen: Alle Befehle in das Textfeld der SQL-Konsole kopieren, Button Ausführen (oder Strg+Enter) drücken. Bei Erfolg erscheint pro Befehl „Ausgeführt.“ und danach „Gespeichert um …“.

Wichtig: AUTO_INCREMENT wird unterstützt – Primärschlüsselwerte (1, 2, 3, …) werden automatisch vergeben: Wer einen INSERT schreibt, in dem die Schlüssel-Spalte fehlt (oder NULL ist), erhält den nächsten Wert. Explizite Werte bleiben erlaubt, nach dem Eingeben eines höheren Werts zählt es hinterher weiter – wie in MySQL. Offizielle Skripte tragen explizite Schlüsselwerte und funktionieren unverändert.

Kontrolle: Der Bereich Tabellen und Daten listet jetzt die 7 Tabellen.

Alternative: Tabelle per Dialog anlegen

Einfache Tabellen lassen sich ohne SQL auch im Bereich Tabellen und Daten per Button „Neue Tabelle“ (oben im Bereich) anlegen:

  1. Tabellenname eingeben (Kleinschreibung: Buchstaben, Ziffern, _).
  2. Unter Spalten steht zunächst eine Spalte; mit „Spalte hinzufügen“ kommen weitere dazu. Je Spalte: Name, Typ (Ganzzahl, Dezimal, Kurzer Text (mit Länge), Text, Datum) und optional Primärschlüssel (Kästchen) sowie Fremdschlüssel („Fremdschlüssel: Tabelle“ + „Fremdschlüssel: Spalte“, per Auswahl aus den vorhandenen Tabellen; die Spalten-Auswahl hängt von der gewählten Tabelle ab).
  3. Primärschlüssel: maximal ein Kästchen kann angehakt sein – ein zweites hebt das erste automatisch auf. Ein ganzzahliger Primärschlüssel wird automatisch vergeben (Auto-ID): Beim Datenerfassen darf das ID-Feld leer bleiben.
  4. Button „Tabelle anlegen“ → die Tabelle erscheint sofort im Bereich. Bei Fehlern steht die Meldung direkt unter dem jeweiligen Feld (z. B. „Tabelle ‚teams‘ existiert bereits.“, „Spalte 2: Für den Fremdschlüssel bitte die Spalte in der Tabelle ‚teams‘ wählen.“), und der Fokus springt ins erste ungültige Feld.

Der Dialog unterstützt noch nicht zusammengesetzte Primärschlüssel, UNIQUE und Default-Werte – dafür die SQL-Konsole (oder „Tabellen aus Modell erstellen“). Fremdschlüssel verweisen nur auf vorhandene Tabellen: Die neue Tabelle selbst steht im Feld „Fremdschlüssel: Tabelle“ noch nicht zur Auswahl.

Schlüssel und Typen in den Spaltenköpfen: In jeder Tabellenansicht tragen die Spaltenköpfe ein Badge, falls die Spalte ein Schlüssel ist: PK = Primärschlüssel (eigene Tabellenspur), FK = Fremdschlüssel (Beziehung zu einer anderen Tabelle). So sieht man auf einen Blick, welche Spalten die Beziehungen aus dem Relationenmodell tragen. Mit dem Schalter „Typen anzeigen“ (über den Tabellen, standardmäßig aus) erscheinen zusätzlich die deklarierten Spaltentypen (z. B. INT, VARCHAR(50)) – hilfreich, um die richtigen Werttypen einzugeben.

Tabelle löschen: Hinter jeder Tabellen-Überschrift steht ein Mülleimer-Button (🗑). Beim Klick erscheint eine Bestätigungsmeldung mit der Zeilenanzahl; zusätzlich wird gewarnt, falls andere Tabellen die Tabelle per Fremdschlüssel referenzieren oder sie im Modell (Reiter „Modell“) enthalten ist – dann wird der Modell-Eintrag samt Relationen mit entfernt. Enthält eine referenzierende Tabelle noch Zeilen, kann die Tabelle nicht gelöscht werden (Fremdschlüssel); die Meldung zeigt, welche Zeilen zuerst gelöscht werden müssen. Mit „Abbrechen“ bleibt alles unverändert.

5. Daten eintragen

Variante A: SQL (schnell, mehrere Zeilen auf einmal)

In der SQL-Konsole, z. B.:

INSERT INTO rennstrecke VALUES (1, 'Nürburgring', 52);
INSERT INTO rennstrecke VALUES (2, 'Hockenheimring', 45);
INSERT INTO teamleiter VALUES (1, 'Klaus', 'Meier', 'meier@msc-nfis.de');
INSERT INTO teamleiter VALUES (2, 'Anja', 'Schulz', 'schulz@msc-nfis.de');
INSERT INTO teams VALUES (1, 'Flugteam Nord', 1);
INSERT INTO teams VALUES (2, 'Sturmflieger', 2);
INSERT INTO teams VALUES (3, 'Alpina Speed', 1);
INSERT INTO rennveranstaltung VALUES (1, '2026-04-12', 'Westmünster-Cup', 1);
INSERT INTO rennveranstaltung VALUES (2, '2026-06-20', 'Alpha-Challenge', 2);
INSERT INTO teilnahmen VALUES (1, 1, 1, 2);
INSERT INTO teilnahmen VALUES (2, 2, 1, 1);
INSERT INTO teilnahmen VALUES (3, 1, 2, 3);
INSERT INTO fahrer VALUES (1, 'Ben', 'Albers', 'FIA-2026-011', 1);
INSERT INTO fahrer VALUES (2, 'Lina', 'Kurz', 'FIA-2026-027', 2);
INSERT INTO mechaniker VALUES (1, 'Paul', 'Winter', '0171 2345678', 1);

Pro Befehl steht „1 Zeile betroffen.“. Daten werden im Format JJJJ-MM-TT geschrieben (z. B. '2026-04-12').

Fremdschlüssel-Reihenfolge: Zuerst die Tabellen, auf die verwiesen wird (hier rennstrecke und teamleiter), dann teams, rennveranstaltung, fahrer, mechaniker – und zuletzt teilnahmen. Wer eine Zeile in teams speichern will, deren teamleiternr es in teamleiter noch nicht gibt, erhält: „Fremdschlüssel-Verletzung: Die Aktion verletzt eine Referenz zu einer anderen Tabelle.“

Variante B: Formular (Zeile für Zeile)

  1. Tabellen und Daten → Button „Neue Zeile für fahrer hinzufügen“.
  2. Im Formular gibt es ein Feld pro Spalte. Die Feldbezeichnung zeigt Name und Typ, z. B. „lizenznr (VARCHAR(50)) (Pflicht)“ – Pflichtfelder tragen das Wort „(Pflicht)“ zusätzlich. Bei Tabellen mit AUTO_INCREMENT-Primärschlüssel trägt das ID-Feld stattdessen „(automatisch)“: Es ist beim Hinzufügen mit dem nächsten Wert vorbelegt, darf aber auch selbst belegt oder leer gelassen werden (dann wird der nächste Wert automatisch vergeben).
  3. Alle Felder ausfüllen, Button Speichern drücken.
  4. Bestätigung: „Gespeichert um …“. Bei Fehlern steht die Meldung direkt unter dem Feld (z. B. Pflichtfeld, „muss eine ganze Zahl sein“, Datum im Format JJJJ-MM-TT, Primärschlüsselwert bereits vergeben) und der Fokus springt ins erste ungültige Feld.

Zeile ändern: Button „Zeile 2 (Ben) ändern“ → Formular mit den aktuellen Werten → Speichern.

Zeile löschen: Button „Zeile 2 (Ben) löschen“. Solange andere Zeilen darauf weisen (z. B. teilnahmen auf das Team), wird das Löschen mit einer Fremdschlüssel-Verletzung abgelehnt – zuerst die verweisenden Zeilen löschen.

6. Abfragen (SELECT)

Abfragen laufen ebenfalls in der SQL-Konsole. Das Ergebnis erscheint als Tabelle mit der Anzahl der Zeilen als Überschrift.

1. Alle Rennveranstaltungen

SELECT * FROM rennveranstaltung;

2. Auf welcher Strecke findet welche Veranstaltung statt (JOIN)

SELECT rv.veranstaltungsname, rs.streckenname
FROM rennveranstaltung AS rv
JOIN rennstrecke AS rs ON rv.streckennr = rs.streckennr
ORDER BY rv.veranstaltungsdatum;

3. Welches Team hat welche Veranstaltung gewonnen (JOIN + WHERE)

SELECT t.teambezeichnung, rv.veranstaltungsname
FROM teilnahmen AS tn
JOIN teams AS t ON tn.teamnr = t.teamnr
JOIN rennveranstaltung AS rv ON tn.veranstaltungsnr = rv.veranstaltungsnr
WHERE tn.teamplatzierung = 1;

4. Wie viele Teams sind bei jeder Veranstaltung gestartet (GROUP BY + COUNT)

SELECT veranstaltungsnr, COUNT(*) AS teilnehmer
FROM teilnahmen
GROUP BY veranstaltungsnr;

5. Alle Fahrer eines Teams (WHERE)

SELECT vorname, nachname FROM fahrer WHERE teamnr = 1;

Tipp: Die letzten 20 ausgeführten Befehle je Datenbank stehen in der Historie darunter – ein Klick legt den Befehl wieder ins Textfeld.

7. Hausaufgabe 3.3 „Schulen“ – Vorgehen

  1. Neue Datenbank anlegen, z. B. schulen (Kleinschreibung).
  2. Eigens das passende eERM / Relationenmodell erstellen (das ist der Auftrag!) – jede Entität und jede aufgelöste Vielmehr-zu-Vieler-Beziehung wird eine Tabelle.
  3. Wie in Abschnitt 4: Für jede Tabelle ein CREATE TABLE schreiben und alle Befehle gemeinsam ausführen.
  4. Beispiel-Daten eintragen (SQL oder Formular), Fremdschlüssel-Reihenfolge beachten.
  5. Mit SELECT die geforderten Informationen abfragen.

8. Daten speichern und exportieren

9. Was die App kann – und was nicht

Die App arbeitet mit einer Datenbank-Engine im Browser (SQLite), nicht mit einem MySQL-Server. Deshalb:

10. Fehlermeldungen – Schnellübersicht

Deutsche Fehlermeldungen der App: Bedeutung und Lösung
Meldung Bedeutung Lösung
Ungültiger Datenbankname: Bitte Kleinschreibung verwenden … Name nicht zulässig Nur Kleinbuchstaben, Ziffern, _; erster Buchstabe ein Buchstabe
Fremdschlüssel-Verletzung: Die Aktion verletzt eine Referenz zu einer anderen Tabelle. Verwiesene Zeile fehlt oder wird noch referenziert Referenzierte Zeile zuerst anlegen bzw. verweisende Zeilen zuerst löschen
Eindeutigkeits-Verletzung: Dieser Wert ist in dieser Tabelle bereits vergeben. Primärschlüsselwert existiert schon Anderen Wert vergeben
Pflichtfeld-Verletzung: Eine Spalte ohne Wert darf nicht leer bleiben. NOT-NULL-Spalte ist leer Wert eintragen
Hinweis: AUTO_INCREMENT wurde entfernt; Primärschlüsselwerte liefert die Datenbasis … AUTO_INCREMENT an Nicht-Primärschlüssel oder tableseitiger Startwert (AUTO_INCREMENT=…) im DDL Klausel streichen bzw. Wert selbst vergeben (AUTO_INCREMENT an Primärschlüsseln wird automatisch emuliert)
SQL-Fehler: near „…“ Tipp- oder Syntaxfehler Schreibweise, Anführungszeichen, Semikola prüfen

11. Modell (eERD)

Im Bereich Modell entsteht das relationale Datenmodell (eERD). Im Textfeld „Diagramm-Code“ steht Mermaid-Code im Format erDiagram (Entitäten, Attribute, Relationen – Syntax-Hilfe über den Hilfe-Dialog, Alt+H).

12. Tabellen aus dem Modell erstellen

Button „Tabellen aus Modell erstellen“ (Brücke „Modell → Datenbank“): Das Modell wird in CREATE TABLE-Befehle umgewandelt – Entitäten werden zu Tabellen, Attribute zu Spalten, Relationen zu Fremdschlüsseln. Viele-zu-viele- (M:N-)Relationen erzeugen eine Zwischentabelle mit zwei Fremdschlüsseln als zusammengesetztem Primärschlüssel.

Ohne geöffnete Datenbank (freies Modell) heißt der Button „DB aus Modell erstellen“: Zuerst wird in einem Namens-Dialog der Name der neuen Datenbank festgelegt (gleiche Namens-Regeln wie beim Anlegen; existierende Datenbanken werden nie überschrieben), danach erscheint die gewohnte DDL-Vorschau. Nach Erstellen wird die Datenbank angelegt und geöffnet, die Tabellen werden über die Konsolen-Pipeline erzeugt (Notizen und Status erscheinen dort), und das Modell gehört von diesem Moment an zur neuen Datenbank – das freie Modell ist damit abgeschlossen.

  1. Zuerst erscheint eine DDL-Vorschau: alle CREATE TABLE-Befehle, die Tabellen-Namen und eventuelle Hinweise. Erst mit Erstellen geht es weiter.
  2. Existiert eine der Tabellen schon, zeigt die App einen Kollisions-Dialog mit den betroffenen Tabellen und deren Zeilenzahl – Sie entscheiden: Fortfahren (vorhandene Tabellen werden gelöscht, Datenverlust!) oder Abbrechen. Gelöscht wird nie automatisch.
  3. Danach werden die Tabellen in der offenen Datenbank angelegt; die Datenbank wird gespeichert und die neuen Tabellen sind unter „Tabellen und Daten“ zu sehen.

Die Ergebnisse (Notizen und Status) erscheinen in einem Fenster am unteren Bildschirmrand, das Sie über den Button „Schließen“ oder die Taste Esc schließen. Nach einem erfolgreichen Lauf verschwindet das Fenster nach etwa 10 Sekunden automatisch (der Countdown pausiert, solange die Maus über dem Fenster ist). Bei Fehlern bleibt das Fenster sichtbar, bis Sie es bewusst schließen.

13. Modell aus der Datenbank erzeugen

Button „Modell aus Datenbank erzeugen“ (Brücke „Datenbank → Modell“): Die App liest die Tabellen und Fremdschlüssel der offenen Datenbank und erzeugt daraus das erDiagram-Modell.

14. Skriptdatei importieren

In der SQL-Konsole lädt der Button „Skriptdatei importieren (.sql)“ eine SQL-Datei direkt in das Textfeld. Ist das Textfeld nicht leer, wird vor dem Ersetzen gefragt („Das aktuelle SQL-Feld wird ersetzt. Weiter?“). Danach läuft die Datei mit Ausführen (oder Strg+Enter) ab – die offiziellen Unterrichtsskripte (z. B. kino, sql_island, fahrradvermietung) lassen sich so ohne Änderungen importieren und ausführen.

15. Große Tabellen

16. Bildanalyse (online)

Der Button „Aus Bild“ im Bereich Modell wandelt ein Foto oder einen Upload eines (auch handgezeichneten) ER-Diagramms in erDiagram-Code um – nach Bestätigung ersetzt er das aktuelle Modell.

17. Aktualisierungen

Wird eine neue Version der App bereitgestellt, erscheint oben ein Banner: „Neue Version der App ist verfügbar.“ – mit den Buttons „Jetzt laden“ und „Später“. Das Update ist eine bewusste Entscheidung („opt-in“) und läuft nie automatisch: Bei „Jetzt laden“ wird die neue Version geladen, bei „Später“ verschwindet das Banner (es erscheint bei der nächsten Aktualisierungs-Phase erneut).