Der Kontostand verschwindet auf halbem Weg
Du überweist 30 Euro an eine Freundin. Das Programm zieht sie von deinem Konto ab. Dann bricht der Strom aus, bevor sie auf ihrem ankommen.
Das Geld ist weg. Eine Datenbank schützt davor mit einer Transaktion: Entweder passiert alles, oder nichts.
Am Ende dieser Lektion
Notiz
Ich kann Daten ändern, ohne etwas zu verlieren.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| INSERT | fügt eine neue Zeile hinzu |
| UPDATE | ändert Werte in bestehenden Zeilen |
| DELETE | löscht Zeilen |
| Transaktion | mehrere Schritte, die ganz oder gar nicht gelten |
| Rollback | nimmt alle Änderungen einer Transaktion zurück |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Drei Befehle ändern den Inhalt einer Tabelle
INSERT INTO tabelle (spalten) VALUES (werte) fügt eine Zeile hinzu. UPDATE tabelle SET spalte = wert WHERE bedingung ändert Zeilen. DELETE FROM tabelle WHERE bedingung löscht sie.
Bei UPDATE und DELETE entscheidet WHERE, welche Zeilen sie treffen. Ohne WHERE trifft der Befehl jede Zeile der Tabelle.
Beispiel: was fehlendes WHERE anrichtet
| Befehl | Trifft |
|---|---|
| UPDATE lager SET status = 'leer' WHERE id = 3 | Eine Zeile |
| UPDATE lager SET status = 'leer' WHERE bestand < 5 | Zwei Zeilen |
| UPDATE lager SET status = 'leer' | Alle vier Zeilen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Erst mit SELECT ansehen, dann ändern
Ein UPDATE meldet nur, wie viele Zeilen es geändert hat. Ob es die richtigen waren, sagt es nicht.
Schreib darum zuerst ein SELECT mit demselben WHERE. Es zeigt dir genau die Zeilen, die der Befehl treffen würde. Stimmen sie, ersetzt du SELECT ... durch den Änderungsbefehl.
Probier es: erst ansehen, dann ändern
-- Erst ansehen, was das UPDATE treffen würde.
SELECT id, teil, bestand FROM lager WHERE bestand < 5;
-- Dann ändern, mit demselben WHERE.
UPDATE lager SET status = 'nachbestellen' WHERE bestand < 5;
-- Und prüfen.
SELECT id, teil, status FROM lager ORDER BY id;
Ein häufiger Fehler
Warnung
Viele glauben, man könne einen Fehler bei DELETE rückgängig machen wie ein gelöschtes Dokument. Das stimmt nicht. Eine bestätigte Änderung bleibt. Nur eine Transaktion, die du noch nicht bestätigt hast, lässt sich zurücknehmen.
Bevor du anfängst
Notiz
Drück oben in der Leiste auf Lab starten, warte auf beide Dienste und öffne das Terminal. Alle Runs arbeiten in deiner eigenen Datenbank student_kino. Der Shop bleibt unverändert.
Das Zertifikat des Servers annehmen
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung für die Datenbank shop
alias sql='mariadb -h db -u student -pstudent shop -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine eigene Datenbank anlegen
sql "CREATE DATABASE IF NOT EXISTS student_kino"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung dafür
alias kino='mariadb -h db -u student -pstudent student_kino -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Konten anlegen und füllen
kino "DROP TABLE IF EXISTS konten; CREATE TABLE konten (id INT AUTO_INCREMENT PRIMARY KEY, inhaber VARCHAR(20) NOT NULL, stand INT NOT NULL); INSERT INTO konten (inhaber, stand) VALUES ('Anna', 100), ('Ben', 50)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Transaktion gilt ganz oder gar nicht
Eine Überweisung besteht aus zwei Änderungen: Abziehen und Gutschreiben. Beide gehören zusammen.
Mit START TRANSACTION beginnst du eine Transaktion. Mit COMMIT bestätigst du alle Änderungen. Mit ROLLBACK nimmst du alle zurück, als hätte es sie nie gegeben.
Abziehen, ansehen und alles zurücknehmen
kino "START TRANSACTION; UPDATE konten SET stand = stand - 30 WHERE inhaber = 'Anna'; SELECT inhaber, stand FROM konten ORDER BY inhaber; ROLLBACK; SELECT inhaber, stand FROM konten ORDER BY inhaber"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die ganze Überweisung bestätigen
kino "START TRANSACTION; UPDATE konten SET stand = stand - 30 WHERE inhaber = 'Anna'; UPDATE konten SET stand = stand + 30 WHERE inhaber = 'Ben'; COMMIT; SELECT inhaber, stand FROM konten ORDER BY inhaber"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Zeile löschen, dann zählen
kino "DELETE FROM konten WHERE inhaber = 'Ben'; SELECT COUNT(*) AS konten FROM konten"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.