![]() |
Datenbank: MySQL • Version: % • Zugriff über: UniDac
[SQL] Baumstruktur bzw. Teilbaum löschen?
Hallo,
ich möchte gerne in meinem Baum, den ich mir aus der Datenbank hole Knoten löschen. Bisher sieht mein Ansatz dazu so aus:
SQL-Code:
Die Tabelle sieht vereinfacht so aus: | id | parent | name | level |
DELETE FROM icstree WHERE id = :id OR parent = :id
Mein Problem ist jetzt: Wie gehe ich in die Tiefe? Mit dem obigen Code lösche ich ja nur einen Knoten mit seinen Unterknoten. Ich will aber auch die Unterknoten von den Unterknoten usw... löschen. Geht das überhaupt mit einer SQL-Abfrage? Viele Grüße ... |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Was genau meinst du?
Also mit Fremdschlüsseln kann man kaskadierend löschen. |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Hi,
Beispiel: K1 K2 |--K16 |--K18 |--K19 ----|--K34 ----|--K46 K3 K5 Jetz möchte ich K2 löschen und zwar mit allen Unterknoten. Mit meinem SQL erreiche ich aber nur K2,K16,K18 und K19. K34 und K46 bleiben als Leichen in der Datenbank (Diese haben ja als Parent K19). Diese will ich aber auch erreichen. Viele Grüße ... |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
er braucht praktisch etwas wie
SQL-Code:
DELETE FROM icstree WHERE id = :id OR parent = _ID_eins_der_gelöschten_Einträge_
|
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Zitat:
|
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Ich weiss nicht ob MySQL das kann, aber ich würde einen Foreign Key von parent auf ID legen mit der option Delete Cascade und Update Cascade.
Damit referenziert der Foreign Key auf sich selber. Löscht Du jetzt einen Eintrag werden alle abhängigen Datensätze gelöscht, bis zum letzten Zweig. Ein zusätzlicher Efekt ist auch, dass die Referenz zum Parent geprüft wird beim Insert. So hast bekommst Du Keine "blinden" Einträge. Gruß Borwin |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Zitat:
|
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Hallo,
MySql kann Foreign Keys wohl nur mit InnoDB. Meine Datenbank ist MyISAM. Weitere Vorschläge, die mich vorm durchiterieren durch den Teilbaum bewahren? Viele Grüße ... |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Zitat:
|
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Das sollte jedes ordentliche DBMS können
|
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Wie wärs damit:
SQL-Code:
:mrgreen:
ALTER TABLE icstree ENGINE = InnoDB
Oder benötigst du Volltextsuche? |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Zitat:
|
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Zitat:
Wenn das MYSQL nicht kann kommst Du um einen Rekrusive Verarbeitung in Deinem Code nicht herum :pale: Gruß BORWIN |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
kennt MySql diese komischen Stored-Procedures (oder wie die hießen) ?
ansonsten
Delphi-Quellcode:
das sollte sich ja leicht als Prozedur im Clientprogramm oder als "Stored-Procedure" im DB-Server machen lassen.
procedure delete(id)
begin IDs = gibt_alle_IDs_(mit "parent" = id) für_alle_IDs delete(IDs[i]) lösche(id); end; |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Rekursiv... ich hör immer rekursiv... Rekursive Aufrufe sind in RDBMS unerwünscht, weil sie den Stack belasten und potentielle Kandidaten für einen Absturz infolge Endlosrekursion sind. Daher gibt es z.B. in MSSQL eine maximale Aufruftiefe...
Wenn die optimale Methode mit den Foreign Keys und dem kaskadierten löschen nicht funktioniert, dann geht es auch so (MSSQL Dialekt)
SQL-Code:
create procedure DeleteSubTree @ID int
as declare @Done bit -- Temporäre Arbeitstabelle erstellen. Sie enthält die zu löschenden Knoten create table #IdsToDelete (ID int) -- Damit das nicht ewig dauert, einen Index create index tmpIndex on #IdsToDelete (ID) -- Erstmal den Knoten, den wir löschen wollen insert into #IdsToDelete (ID) values (@ID) set @Done = 0 while (@Done = 0) begin -- Alle Knoten, dessen Vorgänger in der Arbeitstabelle sind, in die Arbeitstabelle einfügen insert into #IdsToDelete select ParentID from TreeStructure where ID in (select ID from #IdsToDelete) -- Alle Knoten im Baum löschem, die sich in der Arbeitstabelle befinden delete from TreeStructure where ID in (select ID from #IdsToDelete) if (@@ROWS_AFFECTED = 0) set @Done = 1 -- Hier könnte man noch die Knoten aus der Arbeitstabelle löschen, die nicht -- mehr in der Baumstruktur existieren, aber das fast immer ein Mehraufwand -- Ausnahme: Sehr große Baumstrukturen end |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Zitat:
Wie oben schon erwähnt... Tabellenstruktur:
SQL-Code:
Beispiel für einen kompletten Löschvorgang:
CREATE TABLE nodes (
node_id INT NOT NULL, parent_id INT, bez VARCHAR(45), CONSTRAINT PK_nodes PRIMARY KEY (node_id), CONSTRAINT FK_nodes_parent FOREIGN KEY (parent_id) REFERENCES nodes (node_id) ON DELETE CASCADE )
SQL-Code:
@alzaimar: Das geht so in MSSQL, MySQL kann leider innerhalb eines INSERT-Statements nicht dieselbe Tabelle nochmal beinhalten, deshalb geht dieser Vorschlag so nicht (dafür benötigt man noch eine zusätzliche temporäre Tabelle).
DELETE FROM nodes
WHERE parent_id IS NULL |
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
Zitat:
|
Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
@sirius Es war nicht so gemeint, wie es sich angehört hat. Sorry.
Aber eine Entity kann eben auch mit sich selbst eine Beziehung eingehen. Verwendet man solche Strukturen, wird es erst richtig interessant. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz