SQL Selbst referenzierende Einträge löschen

UnKnOwN_86

Ensign
Registriert
Apr. 2010
Beiträge
186
Hi.

Ich würde gerne auf elegante Weise Daten einer Tabelle löschen die selbst referenzierend sind.
Beispiel Daten:

ID--PARENT_ID-----SomeRandomText
1....0.....................Entry 1
2....1.....................Entry 2
3....1.....................Entry 3
4....2.....................Entry 4
5....3.....................Entry 5

Wenn ich nun den ersten Datensatz lösche (Entry 1) dann sollten alle anderen auch gelöscht werden, weil 2 und 3 "Kindselemente" von 1 sind, 4 ist von 2 und 5 ist von 3 das "Kindselement".

Ich bau mir zur Zeit eine SQL-Statement mit
delete bla where PARENT_ID in (select ID from bla where PARENT_ID = 1)

Das noch 10 mal und immer mehr IN (select...) da das mitlerweile unübersichtlich ist, dachte ich mir vielleicht gibt es eine bessere SQL Lösung.

Zusätzlich zu diesen Datensätzen gehört auch noch eine weitere Tabelle gelöscht, die eine 1:N Beziehung darstellt und für Verweise zuständig ist.

Also in der Zweiten Tabelle wäre:
ID--MainTableID-----DetailInfos
1....1.....................DetailInfo 1
2....1.....................DetailInfo 1.1
3....2.....................DetailInfo 2
4....3.....................DetailInfo 3
5....3.....................DetailInfo 3.1
6....4.....................DetailInfo 4
7....5.....................DetailInfo 5

Diese sollte nach dem Löschvorgang auch leer sein, da die "MainTableID" 1-5 bereits oben aufgrund der Selbstreferenzierung bereinigt worden ist, und somit diese Verweise auch nicht mehr benötigt werden.

Die Lösung sollte für unendlich viele Verschachtelungen/Ebenen funktionieren.

Hoffe ihr könnt mir helfen.
 
Dazu nutzt man normalerweise Kaskadierung beim Erstellen der Datenbank ;)

Z.B. so:
Code:
CREATE TABLE hard_candy 
   (candy_num INT, 
    candy_flavor CHAR(20),
    FOREIGN KEY (candy_num) REFERENCES all_candy
    ON DELETE CASCADE)

Dann wird automatisch alles gelöscht, was von dem Eintrag abhängt.
EDIT2: Falsch ausgedrückt:
Wenn man in dem Beispiel einen Eintrag von "all_candy" löschen würde, so wird automatisch jeder Eintrag von "hard_candy" gelöscht, bei dem sich die "candy_num" auf den zu löschenden Eintrag aus "all_candy" bezieht.


EDIT: Man kann das scheinbar nicht nachträglich aktivieren. D.h. du müsstest den kompletten Table löschen und neu erstellen und befüllen. Aber da dein Programm scheinbar eh noch nicht fertig ist, sollte es ja keine großen Probleme machen.
 
Zuletzt bearbeitet:
Also ich hab in MySQL schon Foreign Keys für gefüllte Tabellen angelegt. Voraussetzung ist dabei, dass die Daten vorher konsistent sind.

Code:
ALTER TABLE 'tabelle_1' 
ADD FOREIGN KEY(parent_id) 
REFERENCES 'tabelle_1'('id') 
ON DELETE CASCADE ;
Sollte eigentlich gehen...
 
Zurück
Oben