Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Foreign key references are present for the record (https://www.delphipraxis.net/118308-foreign-key-references-present-record.html)

mkinzler 5. Aug 2008 10:19

Re: Foreign key references are present for the record
 
Dann veränderst du alte Rechnungen!!! Deshalb sollte man in diesem Fall keine Löschregel verwenden!

Hansa 5. Aug 2008 10:39

Re: Foreign key references are present for the record
 
Ne Markus, da lasse ich nicht mit mir reden. Wenn gelöscht werden muss, dann richtig und basta. :shock: Rechnungen sind als Beispiel sowieso etwas ungeeignet, weil es nur noch eine Frage der Zeit ist, bis einer sagt, die dürften gar nicht gelöscht werden wegen Finanzamt. 8) Um dem zuvorzukommen : was, wenn ich einen Artikel löschen will, der seit über 10 Jahren nicht mehr verkauft wird ? Dann muss aber wirklich alles aus der DB verschwinden, was irgendwie mit dem zu tun hat. Jo, basta. :mrgreen:

mkinzler 5. Aug 2008 11:01

Re: Foreign key references are present for the record
 
Also dann sind wir in diesem Punkt halt anderer Ansicht

marabu 5. Aug 2008 11:04

Re: Foreign key references are present for the record
 
Hallo,

Zitat:

Zitat von DevStar
Beim Löschen der Client-Tabelle zu meiner Master-Tabelle, bekomme ich folgende Fehlermeldung: Foreign key references are present for the record ...

die Client-Tabelle wird sicher einen Fremdschlüssel auf die Master-Tabelle halten und solange dieses Constraint existiert kann die Tabelle nicht entfernt werden. Also zuerst alle Constraints entfernen und dann DROP TABLE.

Grüße vom marabu

p80286 5. Aug 2008 13:50

Re: Foreign key references are present for the record
 
Hallo Hansa,

Zitat:

Ne Markus, da lasse ich nicht mit mir reden. Wenn gelöscht werden muss, dann richtig und basta
Da bin ich ganz Deiner Meinung!

Zitat:

: was, wenn ich einen Artikel löschen will, der seit über 10 Jahren nicht mehr verkauft wird ?
Garnichts löschen! Das sind ganz reale Daten, die in der Vergangenheit eine Berechtigung hatten! Gelöscht werden dürfen nur Daten die keine Berechtigung haben und keinen Bezug zu anderen, realen Daten (sollte bei Spieldaten allerdings nicht vorkommen!) z.B. Spiel oder Test-Daten, davon gibt es in den meisten Datenbanken genug. Aber alles was einen konkreten Hintergrund hat, muß in einer DB vorhanden bleiben!

Es sei denn Deine DB wird nur benutzt um irgendwo anders vorhandene Daten neu zu organisieren, dann wäre das nach meinem Verständnis aber keine "Datenbank" sondern eine "Datensammelstelle".

Gruß
K-H

mkinzler 5. Aug 2008 13:54

Re: Foreign key references are present for the record
 
Zitat:

Garnichts löschen! Das sind ganz reale Daten, die in der Vergangenheit eine Berechtigung hatten! Gelöscht werden dürfen nur Daten die keine Berechtigung haben
Und deshalb ist für mein Beispiel eine kaskadierende Löschregel fehl am Platze

DevStar 5. Aug 2008 23:36

Re: Foreign key references are present for the record
 
Zitat:

Zitat von marabu
Hallo,

Zitat:

Zitat von DevStar
Beim Löschen der Client-Tabelle zu meiner Master-Tabelle, bekomme ich folgende Fehlermeldung: Foreign key references are present for the record ...

die Client-Tabelle wird sicher einen Fremdschlüssel auf die Master-Tabelle halten und solange dieses Constraint existiert kann die Tabelle nicht entfernt werden. Also zuerst alle Constraints entfernen und dann DROP TABLE.

Grüße vom marabu

Habe es jetzt so gelöst, dass ich die Exception abfange und eine Meldung ausgebe, das dieser Daznsatz nicht gelöscht werden kann, da er noch verwendet wird.

Danka an alle.

marabu 6. Aug 2008 07:32

Re: Foreign key references are present for the record
 
Moin,

Zitat:

Zitat von DevStar
Habe es jetzt so gelöst, dass ich die Exception abfange und eine Meldung ausgebe, das dieser Daznsatz nicht gelöscht werden kann, da er noch verwendet wird.

DROP TABLE war wohl ein Missverständnis.

Zitat:

Zitat von DevStar
Beim Löschen der Client-Tabelle zu meiner Master-Tabelle, bekomme ich folgende Fehlermeldung ...

Sorry, aber darunter habe ich als native speaker DROP TABLE und nicht DELETE FROM TABLE WHERE verstanden. In deinem Fall geht es ja wohl nur um einzelne Datensätze.

Wenn deine anderen Formulierungen nicht auch irreführend sind, dann hast du einen Fehler in deinen DRI Constraints, vermutlich hast du Master und Detail verwechselt. Das Abfangen des Fehlers bei gescheitertem DELETE vergleiche ich mit dem Kauf eines Eimers bei einem Leck in der Wasserleitung - wenn du verstehst, was ich meine.

Freundliche Grüße

DeddyH 6. Aug 2008 08:08

Re: Foreign key references are present for the record
 
Nochmal zum Allgemeinverständnis anhand eines Beispiels. Angenommen, wir haben eine Stammdatentabelle mit Augenfarben und eine Detailtabelle mit Personen. In der Personentabelle ist die Augenfarbe als Fremdschlüssel auf die Augenfarbentabelle referenziert.
Code:
Augenfarben:

ID |  Bezeichnung
1      blau
2      braun
3      grün


Personen:

ID |  Name |  Augenfarbe
1      Meier   1
2      Müller  2
3      Schulze 3
Was soll nun mit den Personen geschehen, wenn z.B. die Augenfarbe blau gelöscht wird?

1. Gar nichts, Löschen bei existierenden Referenzen nicht möglich (Standard)
2. Die Referenz wird genullt (ON DELETE SET NULL)
3. Der Detaildatensatz wird ebenfalls gelöscht (ON DELETE CASCADE)

Daten nach Löschen:

Fall 1: siehe oben, Fehlermeldung
Fall 2:
Code:
Augenfarben:

ID |  Bezeichnung
2      braun
3      grün


Personen:

ID |  Name |  Augenfarbe
1      Meier   NULL
2      Müller  2
3      Schulze 3
Fall 3:
Code:
Augenfarben:

ID |  Bezeichnung
2      braun
3      grün


Personen:

ID |  Name |  Augenfarbe
2      Müller  2
3      Schulze 3
Man muss sich also bereits bei der Planung der DB Gedanken darüber machen, welchen dieser 3 Fälle man anstrebt. Wie bereits in diesem Thread angedeutet macht es dabei schon einen Unterschied, ob es sich um Spielstände (nicht für die Ewigkeit gedacht) oder Rechnungen (Daten müssen zwecks Prüfung erhalten bleiben) handelt.

Sollte ich das jetzt falsch dargestellt haben, bitte ich um sofortige Korrektur.

[edit] Nachtrag: Wenn man kaskadiert, muss man das allerdings auch durchgängig tun. Sollte es also weitere Tabellen geben, die sich auf Personen beziehen, muss die Personentabelle auch kaskadierend definiert sein, sonst ist das Löschen ebenfalls nicht möglich. Das zieht sich solange durch, bis es keine Referenzen mehr gibt. Hier liegt auch die große Gefahr dabei: möglicherweise löscht man so Daten, an die man gar nicht gedacht hatte. [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr.
Seite 2 von 2     12   

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-2025 by Thomas Breitkreuz