Zeilen löschen mit DELETE
DELETE löscht Zeilen aus einer Tabelle. Anna Fischer hat den Shop gebeten, ihre Bewertungen zu entfernen:
DELETE FROM bewertungen
WHERE kunde_id = 5;Nach DELETE FROM kommt die Tabelle, und WHERE sagt, welche Zeilen gelöscht werden. Das Ergebnis zeigt Geänderte Zeilen: 2, weil Anna zwei Bewertungen geschrieben hat, und eine Abfrage zeigt, dass von den 25 Bewertungen 23 übrig sind:
SELECT COUNT(*) AS bewertungen
FROM bewertungen;| bewertungen |
|---|
| 23 |
DELETE löscht immer ganze Zeilen, deshalb hat es keine Liste von Spalten: DELETE titel FROM spiele ist ein Fehler, ebenso DELETE * FROM spiele, das dir in anderen Datenbanken begegnen kann. Um nur einen Wert aus einer Zeile zu entfernen, verwende UPDATE: SET stadt = NULL.
Und genau wie ein UPDATE löscht ein DELETE ohne WHERE jede Zeile: Nach DELETE FROM bewertungen; ist die Tabelle leer. Sie existiert weiterhin mit ihren Spalten, aber sie hat keine Zeilen. Probiere das WHERE also zuerst in einem SELECT aus, wie du gelernt hast.
Manche Zeilen lassen sich nicht löschen. Versuche, die erstattete Bestellung 7 zu löschen:
DELETE FROM bestellungen
WHERE id = 7;Error on line 1: FOREIGN KEY constraint failedDie Zeile von positionen mit der Bestellung 7 zeigt mit ihrem Fremdschlüssel bestellung_id auf die Bestellung. Wenn die Bestellung verschwände, würde die Position auf eine Bestellung zeigen, die es nicht gibt. Die Datenbank schützt dich davor: Sie lehnt es ab, eine Zeile zu löschen, auf die eine andere Zeile zeigt. Ihre Meldung sagt nicht, um welche Zeile es sich handelt, du musst sie also selbst finden. Überlege, welche Tabellen einen Fremdschlüssel auf diese haben.
Die Lösung ist, zuerst die Zeilen zu löschen, die darauf zeigen, und dann die Zeile selbst:
DELETE FROM positionen
WHERE bestellung_id = 7;
DELETE FROM bestellungen
WHERE id = 7;Die Reihenfolge ist wichtig: zuerst die Zeilen, die zeigen, und zuletzt die Zeile, auf die sie zeigen. Derselbe Schutz gilt auch für UPDATE: Es kann einen Fremdschlüssel ebenfalls nicht auf eine Zeile zeigen lassen, die es nicht gibt.
So schreibst du es:
Anweisungen
- 1
Robot Rebellion (ID 18) wurde abgesagt: Es wird nie erscheinen. Lösche es aus
spieleund zeige darunter die ID und den Titel der Spiele, die noch nicht erschienen sind (ihrerschienenistNULL), sortiert nach der ID. Nur eines ist übrig:id titel 19 Mystery Manor - 2
Ida Zimmermann (Kundin 9) hat den Shop gebeten, ihr Konto mit allem, was dazugehört, zu löschen. Lösche sie aus
kunden, aber zuerst alles, was auf sie zeigt: ihre Bewertungen, ihre Bestellungen und, vor den Bestellungen, deren Positionen. (Ihre Bestellungen findest du im Tab Tabellen, oder du lässt eine Unterabfrage sie finden.) Zeige danach die ID und den Namen der Kunden mit den IDs 8 bis 10, sortiert nach der ID:id name 8 Leon Wagner 10 Oskar Klein - 3
Stelle zum Schluss sicher, dass sonst nichts fehlt: Zeige in einer Zeile mit den Spalten
bestellungen,positionenundbewertungen, wie viele Bestellungen, Positionen und Bewertungen übrig sind. Jede Spalte kann eine Unterabfrage mitCOUNT(*)sein, und eine Abfrage ohne eigene Tabelle braucht keinFROM. Im Vergleich zum Anfang sollten eine Bestellung, eine Position und eine Bewertung fehlen:bestellungen positionen bewertungen 29 41 24