Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [SQL] Baumstruktur bzw. Teilbaum löschen? (https://www.delphipraxis.net/144199-%5Bsql%5D-baumstruktur-bzw-teilbaum-loeschen.html)

jfheins 2. Dez 2009 12:41

Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
 
Wie wärs damit:
SQL-Code:
ALTER TABLE icstree ENGINE = InnoDB
:mrgreen:

Oder benötigst du Volltextsuche?

Hansa 2. Dez 2009 13:01

Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
 
Zitat:

Zitat von Grolle
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 ...

Die Struktur sieht also so aus : K2 -> K16 -> K34/K64. Wenn K2 gelöscht wird dann soll alles unterhalb von K2 gelöscht werden, also auch K34 etc. Richtig ? Dann müsste das in der Tat kaskadierend gehen. Aber weiss die DB überhaupt was von dem Vorhaben ? Glaubs kaum. 8)

borwin 2. Dez 2009 13:11

Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
 
Zitat:

Aber weiss die DB überhaupt was von dem Vorhaben ? Glaubs kaum. 8)
Erst wenn ein selbstreferenzierender Foreign Key mit Cascade Delete vorhanden wäre.

Wenn das MYSQL nicht kann kommst Du um einen Rekrusive Verarbeitung in Deinem Code nicht herum :pale:

Gruß BORWIN

himitsu 2. Dez 2009 13:30

Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
 
kennt MySql diese komischen Stored-Procedures (oder wie die hießen) ?

ansonsten
Delphi-Quellcode:
procedure delete(id)
begin
  IDs = gibt_alle_IDs_(mit "parent" = id)
  für_alle_IDs delete(IDs[i])
  lösche(id);
end;
das sollte sich ja leicht als Prozedur im Clientprogramm oder als "Stored-Procedure" im DB-Server machen lassen.

alzaimar 2. Dez 2009 14:22

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

omata 2. Dez 2009 23:27

Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
 
Zitat:

Zitat von sirius
Ich hätte nie gedacht, dass es geht einen Fremdschlüssel auf die eigene Tabelle zu legen, aber zumindest Oracle kann das :spin:

Das ist doch was ganz normales!


Wie oben schon erwähnt...

Tabellenstruktur:
SQL-Code:
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
)
Beispiel für einen kompletten Löschvorgang:
SQL-Code:
DELETE FROM nodes
WHERE parent_id IS NULL
@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).

sirius 3. Dez 2009 08:08

Re: [SQL] Baumstruktur bzw. Teilbaum löschen?
 
Zitat:

Zitat von omata
Zitat:

Zitat von sirius
Ich hätte nie gedacht, dass es geht einen Fremdschlüssel auf die eigene Tabelle zu legen, aber zumindest Oracle kann das :spin:

Das ist doch was ganz normales!

Entschuldigt bitte, dass ich das nicht wusste. Wenn man es noch nie gebraucht hat und auch sonst nicht zufällig darüber gestoßen ist, dann bekommt das jemand, der sich so etwas nebenbei autodidaktisch beibringt halt nicht mit.

omata 3. Dez 2009 16:01

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 11:12 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz