![]() |
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 ;) |
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... |
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.
|
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.
|
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 ;) |
Re: FB 1.5: Datensätze bedingt löschen
Zitat:
|
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.
|
Re: FB 1.5: Datensätze bedingt löschen
Zitat:
|
Re: FB 1.5: Datensätze bedingt löschen
Before-Trigger
SQL-Code:
Allerdings geht das nur bis zu einer bestimmten Verschachtelungstiefe: 750 auf Windows, 1000 auf Posix Systemen. Müsste aber reichen, schätze ich. :wink:
Delete from Table1 where Parent_ID = old.ID;
|
Re: FB 1.5: Datensätze bedingt löschen
Soferne es Foreign Keys gibt : ---> CASCADE
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 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