![]() |
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 22:52 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 by Thomas Breitkreuz