Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FB 1.5: Datensätze bedingt löschen (https://www.delphipraxis.net/68954-fb-1-5-datensaetze-bedingt-loeschen.html)

Codehunter 8. Mai 2006 16:49

Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOS

FB 1.5: Datensätze bedingt löschen
 
Ich habe eine Tabelle mit u.A. zwei INT-Feldern. Eines ist der Primärschlüssel ("ID"), das andere ein Sekundärschlüssel ("PARENT_ID"). Das Ganze bildet eine hierarchische Struktur. Das Feld PARENT_ID eines Datensatzes verweist auf das Feld ID eines anderen Datensatzes in der selben Tabelle. Wenn ein Datensatz gelöscht wird (DELETE FROM TABLE WHERE ID=foo) dann sollen alle weiteren Datensätze gelöscht werden, deren Feld PARENT_ID auf einen Datensatz verweist der nicht mehr existiert. Ich habe mir folgendes gedacht, was aber leider nicht funktioniert:

DELETE FROM TABLE T1 WHERE (SELECT COUNT(*) FROM TABLE T2 WHERE T2.ID=T1.PARENT_ID)=0;

Mit dieser Query werden alle Datensätze gelöscht. Das ist natürlich etwas ungünstig ;)

RavenIV 8. Mai 2006 16:53

Re: FB 1.5: Datensätze bedingt löschen
 
Falls es im Firebird ForeignKeys gibt, solltest Du dir diese Technik mal anschauen.
Laut Info eines Arbeitskollegen soll es das geben.

Ausserdem würde ich mir für die "Parents" eine eigene Tabelle gönnen...

Codehunter 8. Mai 2006 17:11

Re: FB 1.5: Datensätze bedingt löschen
 
Die Parents MÜSSEN sich in der selben Tabelle befinden. Das ganze ist eine nicht näher definierte Verschachtelungstiefe. Es ist also nicht gesagt daß ein "Child-Datensatz" nicht noch weitere "Child-Datensätze" besitzt.

Dax 8. Mai 2006 17:22

Re: FB 1.5: Datensätze bedingt löschen
 
Wie wärs denn dann mit einem BeforeDelete-Trigger, der automatisch alle Schlüssel löscht, die dem zu löschenden untergeordnet sind. Pro Löschbefehl aus dem Trigger dürfte der Trigger nochmals ausgelöst werden, so kannst du also beliebige Verschachtelungen aus der Tabelle tilgen.

Codehunter 8. Mai 2006 17:28

Re: FB 1.5: Datensätze bedingt löschen
 
Ok klingt eigentlich am logischsten und dürfte auch die konsistentesten Datenbestände produzieren. Nur bleibt noch die Frage, WIE finde ich die Datensätze deren Feld PARENT_ID auf Datensätze verweist die nicht mehr existieren? Mein Ansatz oben hat wie gesagt nicht funktioniert. Oder müßte ich die Sache von der anderen Seite her aufrollen? Also den Before-Trigger alle verknüpften Datensätze löschen lassen bevor der eigentlich übergeördnete Datensatz getilgt wird? Hast du das gemeint?

PS: Ich komme eigentlich von MySQL, Firebird ist für mich größtenteils noch Böhmische Dörfer ;)

Dax 8. Mai 2006 17:30

Re: FB 1.5: Datensätze bedingt löschen
 
Zitat:

Zitat von Codehunter
Oder müßte ich die Sache von der anderen Seite her aufrollen? Also den Before-Trigger alle verknüpften Datensätze löschen lassen bevor der eigentlich übergeördnete Datensatz getilgt wird? Hast du das gemeint?

Anders wird es ja nicht funktionieren, da BeforeDelete nicht umsonst das Before im Namen hat ;)

Codehunter 8. Mai 2006 17:38

Re: FB 1.5: Datensätze bedingt löschen
 
Wie gesagt ich komme von MySQL (4.x) da ist mit Triggern nicht so sehr viel los ;) Darum muß ich mich gedanklich erstmal in diese Materie einarbeiten.

mkinzler 8. Mai 2006 17:42

Re: FB 1.5: Datensätze bedingt löschen
 
Zitat:

Zitat von Dax
Wie wärs denn dann mit einem BeforeDelete-Trigger, der automatisch alle Schlüssel löscht, die dem zu löschenden untergeordnet sind. Pro Löschbefehl aus dem Trigger dürfte der Trigger nochmals ausgelöst werden, so kannst du also beliebige Verschachtelungen aus der Tabelle tilgen.

Oder eine Delete-Rule anlegen, dann wird automatsich rekursiv gelöscht.

webcss 8. Mai 2006 18:59

Re: FB 1.5: Datensätze bedingt löschen
 
Before-Trigger

SQL-Code:
Delete from Table1 where Parent_ID = old.ID;
Allerdings geht das nur bis zu einer bestimmten Verschachtelungstiefe: 750 auf Windows, 1000 auf Posix Systemen. Müsste aber reichen, schätze ich. :wink:

Hansa 8. Mai 2006 23:59

Re: FB 1.5: Datensätze bedingt löschen
 
Soferne es Foreign Keys gibt : ---> CASCADE


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr.
Seite 1 von 2  1 2      

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