Das vergessene WHERE
Was passiert, wenn ein UPDATE kein WHERE hat? Es ändert jede Zeile der Tabelle. Diese Anweisung sollte einen Kunden nach Hamburg umziehen lassen:
UPDATE kunden
SET stadt = 'Hamburg';Das Ergebnis sagt Geänderte Zeilen: 14: Alle Kunden des Shops wohnen jetzt in Hamburg, und ihre wirklichen Städte sind weg:
| name | stadt |
|---|---|
| Emma Becker | Hamburg |
| Lukas Neumann | Hamburg |
| Olivia Braun | Hamburg |
| … | … |
Die Datenbank fragt nicht, ob du dir sicher bist, und es gibt keine Schaltfläche zum Rückgängigmachen. Dasselbe gilt für DELETE, das du in der nächsten Übung kennenlernst: Ohne WHERE löscht es jede Zeile der Tabelle. Das ist einer der bekanntesten Fehler in der Programmierung, und er passiert auch erfahrenen Programmierern, meist wenn sie eine Anweisung ausführen, bevor sie sie fertig geschrieben haben. Hier bringt das nächste Ausführen die Daten zurück. In einer echten Datenbank führt der einzige Weg zurück über ein Backup, falls es eins gibt.
So schützt du dich:
- Schreibe zuerst das
WHEREund probiere es mit einemSELECTaus. Sieh dir die Zeilen an, bevor du sie änderst: Eine Abfrage mit demselbenWHEREzeigt genau die Zeilen, die die Änderung betrifft. Wenn sie die richtigen findet, mache ausSELECT … FROM kundeneinUPDATE kunden SET …und lass dasWHEREso, wie es ist. - Prüfe „Geänderte Zeilen“. Wenn du einen Kunden ändern wolltest, sollte dort 1 stehen. 14 bedeutet, dass etwas nicht stimmt.
- Verwende eine Transaktion, die Änderungen rückgängig machen kann. Über Transaktionen lernst du am Ende dieser Lektion etwas.
Zum Beispiel hat Leon Wagner eine neue E-Mail-Adresse. Zuerst die Abfrage:
SELECT id, name, email
FROM kunden
WHERE id = 8;| id | name | |
|---|---|---|
| 8 | Leon Wagner | leon.wagner@mail.de |
Sie findet eine Zeile, die richtige, also kann ihr WHERE unverändert in das UPDATE übernommen werden:
UPDATE kunden
SET email = 'leon@wagner.de'
WHERE id = 8;Ein WHERE kann auch andere Zeilen finden als gedacht: mehr (AND geht vor OR, und LIKE '%an%' findet mehr Namen, als du erwartest) oder keine (= NULL findet nie etwas). Ein SELECT mit demselben WHERE zeigt dir das alles, bevor ein Schaden entsteht.
So schreibst du es:
Anweisungen
- 1
Führe die Datei aus. Das erste
UPDATEhat keinWHERE: Das Ergebnis sagtGeänderte Zeilen: 30, und die erste Abfrage zeigt jede Bestellung als erstattet. Bevor du es korrigierst, finde die Zeile, die es ändern soll: Schreibe ganz oben in der Datei eine Abfrage, die die ID, den Kunden und das Datum der Bestellungen von Kundin 3 vom 03.03.2025 zeigt. Sie sollte nur eine finden:id kunde_id bestellt_am 17 3 2025-03-03 - 2
Füge nun dieses
WHEREdem erstenUPDATEhinzu. Es ändert 1 Zeile, und die erste Abfrage am Ende zeigt nur die drei erstatteten Bestellungen:id kunde_id bestellt_am status 7 6 2024-06-01 erstattet 17 3 2025-03-03 erstattet 18 8 2025-03-28 erstattet - 3
Das zweite
UPDATEsoll die Preise der Action- und RPG-Spiele senken, die mehr als 35 € kosten, also drei Spiele, aber es ändert 6 Zeilen. Probiere seinWHEREin einer Abfrage aus, finde heraus, warum es mehr Spiele findet, und korrigiere es. Die letzte Abfrage sollte dann Folgendes zeigen:titel genre preis Robot Rebellion Action 35 Shadow Ninja Action 25 Star Pilots Action 35 Zombie Town Action 30 Dragon Forge RPG 35 Knight's Oath RPG 55