SQL Lektion 6: INSERT, UPDATE, DELETE
Lösung geprüft
Die Aufgabe der heutigen Stunde ist die sechste SQL-Lektion: DML, also Data Manipulation Language. Bis jetzt haben wir nur gelesen. Jetzt schreiben wir – einfügen, ändern, löschen und Tabellen anlegen. Ab hier kann man auch echt was kaputt machen.
a) Bearbeiten Sie die sechste Lektion und erstellen Sie in ihrem
OneNote-Heft eine kompakte übersichtliche Kurzzusammenfassung der
SQL-Befehle.
b) Bearbeiten Sie die Übung 6
Zusatzaufgabe
- Erzeuge einen neuen Kurs.
- Füge diesem Kurs zwei Teilnehmer hinzu.
- Der Kurs wird gestrichen, lösche ihn aus der Datenbank.
Die vier Befehle
-- Zusammenfassung der sechsten SQL-Lektion: DML
-- @meininfokurs.cmrg.site
-- INSERT: neue Zeile einfuegen
INSERT INTO tabellen_name VALUES ('x', 'y', 'z');
-- Besser: mit Spaltennamen, dann ist die Reihenfolge egal
INSERT INTO kurse (id, name, raum) VALUES (12, 'Informatik GK', 'B204');
-- UPDATE: vorhandene Zeilen aendern
UPDATE kurse
SET raum = 'C101'
WHERE id = 12;
-- DELETE: Zeilen loeschen
DELETE FROM kurse
WHERE id = 12;
-- CREATE TABLE: neue Tabelle anlegen
CREATE TABLE kurse (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
raum VARCHAR(10),
beginn DATE,
typ ENUM('GK', 'LK'),
PRIMARY KEY (id)
);
Die Datentypen
| Typ | Wofür | Beispiel |
|---|---|---|
INT(n) | ganze Zahlen | id INT |
VARCHAR(n) | Text bis n Zeichen | name VARCHAR(50) |
DATE | Datum im Format JJJJ-MM-TT | '2026-09-17' |
ENUM(…) | feste Auswahl an Werten | ENUM('GK','LK') |
ENUM ist genau dasselbe Prinzip wie das enum in
Java bei der Klasse Termin: eine feste, begrenzte Auswahl.
Schreibt man etwas anderes hinein, lehnt die Datenbank es ab, statt es
stillschweigend zu speichern.
Bei VARCHAR gibt die Zahl die Höchstlänge an. Zu knapp
gewählt, und lange Namen werden abgeschnitten – bei VARCHAR(10)
passt „Informatik GK" schon nicht mehr rein.
Das WHERE bei UPDATE und DELETE
DELETE FROM kurse; -- loescht ALLE Kurse. Ohne Nachfrage.
UPDATE kurse SET raum = 'C101'; -- setzt ALLE Kurse auf C101.
Das ist der Befehl, mit dem man sich richtig Ärger einhandelt. Ein
vergessenes WHERE ist syntaktisch völlig korrekt – die
Datenbank fragt nicht nach und es gibt kein Rückgängig.
Angewöhnen kann man sich das hier: schreib die Anweisung erst
als SELECT und schau dir an, welche Zeilen
betroffen wären.
-- 1. Erst gucken, was getroffen wird
SELECT * FROM kurse WHERE id = 12;
-- 2. Wenn das stimmt, dasselbe WHERE fuers Loeschen benutzen
DELETE FROM kurse WHERE id = 12;
Die Zusatzaufgabe
kurse(id, name),
teilnehmer(id, vorname, nachname) und der
Verknüpfungstabelle kurs_hat_teilnehmer(kurs_id, teilnehmer_id).
Namen gegebenenfalls anpassen.
Schritt 1 – Einen neuen Kurs erzeugen
INSERT INTO kurse (id, name) VALUES (12, 'Informatik GK Q2');
Schritt 2 – Zwei Teilnehmer hinzufügen
-- Erst die Personen selbst, falls es sie noch nicht gibt
INSERT INTO teilnehmer (id, vorname, nachname) VALUES (101, 'Anna', 'Berger');
INSERT INTO teilnehmer (id, vorname, nachname) VALUES (102, 'Ben', 'Klein');
-- Dann die Zuordnung zum Kurs
INSERT INTO kurs_hat_teilnehmer (kurs_id, teilnehmer_id) VALUES (12, 101);
INSERT INTO kurs_hat_teilnehmer (kurs_id, teilnehmer_id) VALUES (12, 102);
Genau hier zahlt sich das Kapitel über Eltern- und Kindtabellen aus. Die
Reihenfolge ist nicht beliebig: erst der Kurs und die Teilnehmer, dann die
Zuordnung. Wer zuerst in kurs_hat_teilnehmer schreibt,
bekommt einen Fremdschlüsselfehler, weil es Kurs 12 noch gar nicht gibt.
Schritt 3 – Den Kurs löschen
-- Erst die Zuordnungen, sonst verweisen sie ins Leere
DELETE FROM kurs_hat_teilnehmer WHERE kurs_id = 12;
-- Dann den Kurs selbst
DELETE FROM kurse WHERE id = 12;
Beim Löschen ist die Reihenfolge genau umgekehrt zum Einfügen: von innen nach außen, vom Kind zum Elternteil. Versucht man zuerst den Kurs zu löschen, verhindert die referenzielle Integrität das – es gibt ja noch Zeilen, die auf ihn zeigen.
Und die Teilnehmer bleiben stehen. Der Kurs wurde gestrichen, die Personen gibt es aber weiterhin und sie sind vermutlich in anderen Kursen. Das war in der Aufgabe auch nicht gefordert.
CREATE TABLE auch
ON DELETE CASCADE angeben – dann räumt die Datenbank die
Kindzeilen von selbst mit weg. Bequem, aber gefährlich: ein
DELETE löscht dann unter Umständen viel mehr, als man
wollte.