Datensätze löschen - DELETE FROM
Anzeige Hier werben
Zum Löschen von Datensätzen steht unter SQL der Befehl DELETE zur Verfügung. Dass Sie nicht mehr benötigte Daten löschen sollten, muss ja nicht tiefschürfend begründet werden. Sie können dann den Computer und die Datenbank selber besser warten, da können die Festplatten neuer Geräte noch so groß sein. Auch die Zugriffe werden einfacher und schneller.
Allerdings ist es immer voller Risiko, etwas zu löschen. Theoretisch gibt es die Möglichkeit, mit ROLLBACK eine Löschung wieder zurückzunehmen, aber das hängt mal wieder vom Datenbanksystem ab, das Sie benutzen. Vergewissern Sie sich lieber, dass Sie genau die Daten löschen, die Sie auch löschen wollen.
Erinnern Sie sich auch an eventuell angelegte Fremdschlüssel: Denen konnten Sie ja eine Anweisung mitgeben, wie eine abhängige Tabelle auf Löschungen in der Vatertabelle reagieren soll.
Wenn Sie Datensätze einer Tabelle löschen, kann sich das also auch auf andere Tabellen auswirken – oder sogar gar nicht durchgeführt werden:
1 | ON DELETE NO ACTION
|
Die Anweisung verhindert, dass Sie in der Vatertabelle Datensätze löschen, auf die sich Datensätze der abhängigen Tabelle beziehen.
Einführungsbeispiel
Nehmen wir an, der Kunde Rainer Zwilling wurde zweimal in die Tabelle aufgenommen. Sie wollen nun einen der Einträge löschen. Nachdem Sie sich für den Datensatz mit der Kundennummer 10 entschieden haben, gehen Sie so vor:
1 2 | DELETE FROM kunde
WHERE kundennr = 10;
|
Grundsätzlich sieht der DELETE-Befehl so aus:
1 2 | DELETE FROM tabellenname
[WHERE auswahlbedingung];
|
Sie geben die Tabelle an, aus der Sie löschen wollen, und schränken in der Bedingung die Datensätze ein, die Sie entfernen wollen. Ohne WHERE und Auswahlbedingung wird der ganze Inhalt der Tabelle gelöscht. Das ist aber nur in den seltensten Fällen nötig. Die Tabellendefinition bleibt bestehen.
Die Auswahlbedingung selbst können Sie als einfachen Vergleich ausgestalten oder mit einer Unterabfrage kombinieren. Inzwischen bereitet Ihnen der Umgang mit WHERE ganz sicher keine Schwierigkeiten mehr.
Beim Löschen von Datensätzen werden natürlich auch die Integritätsregeln der Datenbank berücksichtigt. Wenn ein Fremdschlüssel auf eine Tabelle existiert und noch Datensätze in der zugehörigen Tochtertabelle existieren, wird das Datenbanksystem das Löschen der oder des entsprechenden Datensatzes ablehnen. In unserer Übungsdatenbank läge dieser Fall vor, wenn in der Tabelle bestellung mindestens ein Datensatz existiert, der einem Kundendatensatz über den Fremdschlüssel in der Tabelle kunde zugeordnet ist. Sie können einen solchen Kundendatensatz dann nicht löschen, wenn nicht der Fremdschlüssel in der Tabellendefinition mit ON DELETE CASCADE definiert wurde.
Hinweise zum Praxiseinsatz
Löschbefehle beinhalten immer das Risiko, dass aufgrund einer fehlerhaft formulierten Abfrage Daten unabsichtlich gelöscht werden. Wer auf Nummer sicher gehen will, führt den Befehl zuerst mit einem SELECT aus und prüft, ob die gewünschten Datensätze selektiert werden.
Unterabfragen in DELETE-Befehlen
Ebenso wie in UPDATE-Befehlen können Unterabfragen grundsätzlich auch in DELETE-Befehlen verwendet werden. Sie wollen beispielsweise alle Kunden löschen, deren letzte Rechnung vor dem 1. Januar 2004 liegt. Der Befehl hierfür lautet:
1
2
3
4
5
6 | DELETE FROM kunde WHERE id
IN
(
SELECT kundennr FROM bestellung GROUP BY kundennr
HAVING MAX(rechnungsdatum) < '2004-01-01'
);
|
In der Unterabfrage werden alle Kundennummern selektiert, deren letzte Rechnung vor dem 01.01.2004 liegt. Dies wird in der Form durchgeführt, dass die Rechnungen über die Kunden gruppiert werden und innerhalb des jeweiligen Kunden geprüft wird, ob das letzte Rechnungsdatum (MAX(rechnungsdatum)) vor dem gewählten Datum liegt. Alle Kunden-IDs, die von der Unterabfrage zurückgegeben werden, werden dann über den DELETE-Befehl gelöscht.
Nun müssen Sie auch beim Einführungsbeispiel die Kundennummer von Rainer Zwilling gar nicht mehr heraussuchen, sondern lösen dieses Problem mit einer Unterabfrage:
1
2
3
4
5
6
7 | DELETE FROM kunde
WHERE kundennr =
(
SELECT MAX(kundennr)
FROM kunde
WHERE name = 'Zwilling' AND vorname = 'Rainer'
);
|
Buchhinweis
Die Grundversion dieses Artikels stammt aus dem Buch "Einstieg in SQL" von Marcus Throll und Oliver Bartosch und wurde uns von Galileo Design zur Verfügung gestellt hat. Das Buch kann über die Webseite des Galileo Verlag bestellt werden
Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 2 Personen an der Seite "Datensätze löschen - DELETE FROM" mitgewirkt.
Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Datensätze löschen - DELETE FROM" hier bearbeiten.
-
Meine Schwerpunkte liegen im Bereich Grafikdesign, SEO und Management. Seit sieben Jahren bin ich als Geschäftsführer der Team23 GbR tätig, die Webdesign in Augsburg anbietet, sowie Webmasterpro.de betreut.
-
Ich bin Schüler eines Gymnasiums und beschäftige mich in meiner Freizeit seit vielen Jahren mit HTML- und CSS-Programmierung. Außerdem interessiere ich mich für PHP (WordPress, Drupal, ...), Ruby und Ruby on Rails.



Buchhinweis
Habe mal den Buchhinweis in einen Block getan, weil das bei den anderen Artikeln mit Inhalten vom Galileo Verlag auch so ist
Re: Buchhinweis
Besten Dank. Ist korrekt so wie du es korrigiert hast.