AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FB 1.5: Datensätze bedingt löschen
Thema durchsuchen
Ansicht
Themen-Optionen

FB 1.5: Datensätze bedingt löschen

Ein Thema von Codehunter · begonnen am 8. Mai 2006 · letzter Beitrag vom 9. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

FB 1.5: Datensätze bedingt löschen

  Alt 8. Mai 2006, 16:49
Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOS
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
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

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

  Alt 8. Mai 2006, 16:53
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...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 8. Mai 2006, 17:11
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.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

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

  Alt 8. Mai 2006, 17:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 8. Mai 2006, 17:28
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

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

  Alt 8. Mai 2006, 17:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 8. Mai 2006, 17:38
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 8. Mai 2006, 17:42
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.
Markus Kinzler
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#9

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

  Alt 8. Mai 2006, 18:59
Before-Trigger

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.
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Hansa

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

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

  Alt 8. Mai 2006, 23:59
Soferne es Foreign Keys gibt : ---> CASCADE
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:00 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