AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [SQL] Baumstruktur bzw. Teilbaum löschen?
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] Baumstruktur bzw. Teilbaum löschen?

Ein Thema von Grolle · begonnen am 2. Dez 2009 · letzter Beitrag vom 3. Dez 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#11

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

  Alt 2. Dez 2009, 13:41
Wie wärs damit:ALTER TABLE icstree ENGINE = InnoDB

Oder benötigst du Volltextsuche?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#12

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

  Alt 2. Dez 2009, 14:01
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)
Gruß
Hansa
  Mit Zitat antworten Zitat
borwin

Registriert seit: 14. Sep 2006
Ort: Rostock
72 Beiträge
 
Delphi 2007 Enterprise
 
#13

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

  Alt 2. Dez 2009, 14:11
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

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

  Alt 2. Dez 2009, 14:30
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.
$2B or not $2B
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

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

  Alt 2. Dez 2009, 15:22
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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#16

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

  Alt 3. Dez 2009, 00:27
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
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).
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#17

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

  Alt 3. Dez 2009, 09:08
Zitat von omata:
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
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#18

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

  Alt 3. Dez 2009, 17:01
@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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 Uhr.
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