![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: Delphi, IBX
Foreign key references are present for the record
Beim Löschen der Client-Tabelle zu meiner Master-Tabelle, bekomme ich folgende Fehlermeldung:
SQL-Code:
Was will Firebird mir damit sagen?
Foreign key references are present for the record
Hat jemand eine Idee, wie sich das umgehen läßt? Kennt jemand überhaubt diesen Fehler? Habe vergebends gegoogelt. LG DevStar |
Re: Foreign key references are present for the record
Das ON CASCADE ist falsch eingestellt, oder der DS ist noch active.
|
Re: Foreign key references are present for the record
Zitat:
SQL-Code:
, denn da tritt der Fehler auf.
on delete CASCADE
Stelle ich auf SET NULL oder DEFAULT um, dann wir der Datensatz in meinem View ignoriert, dan ist er weg und wird nicht mehr angezeigt. In der Client-Tabelle sind Bezeichnungen hinterlegt, da ist ja Quatsch, wenn diese gelöscht werden, das dann der Datensatz in der Mastertabelle keine Bezeichnung hat. Also ist CASCADE richtig. Nur müsste ich den Fehler abfangen.
Delphi-Quellcode:
Der Witz ist nur, bei CASCADE ist mein Datensatz in der MAster-Tabelle komplett weg.
ShowMessage ('Eintrag kann nicht gelöscht werden, da er in Tabelle 1 verwendet wird.');
Oder denke ich ganz falsch mit meiner Datenbank? |
Re: Foreign key references are present for the record
Zitat:
|
Re: Foreign key references are present for the record
CASCADE bedeutet, dass beim Löschen des Mastersatzen (z.B. Rechnung) alle Detailsätze ( z.B. Rechnungspositionen) automatisch mitgelöscht werden. Ist imho aber eine gefährliche Option.
|
Re: Foreign key references are present for the record
Zitat:
|
Re: Foreign key references are present for the record
Zitat:
|
Re: Foreign key references are present for the record
Er hat das hier gefragt :
Zitat:
Trotzdem noch hierzu : Zitat:
|
Re: Foreign key references are present for the record
Es gibt auch andere Möglichkeiten: Manuelles Löschen im Code oder Umlenken auf Dummy-Rechnung o.ä. Ich habe auch nicht gesagt das diese Option schlecht ist; man sollte sie halt wohlüberlegt einsetzen. Das Beispiel mit der Rechnung war ja auch ein Pro Beispiel; ein Contra-Fall wäre die Beziehung von Rechnungspositionen zu Artikeln.
|
Re: Foreign key references are present for the record
Zitat:
|
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!
|
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:
|
Re: Foreign key references are present for the record
Also dann sind wir in diesem Punkt halt anderer Ansicht
|
Re: Foreign key references are present for the record
Hallo,
Zitat:
Grüße vom marabu |
Re: Foreign key references are present for the record
Hallo Hansa,
Zitat:
Zitat:
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 |
Re: Foreign key references are present for the record
Zitat:
|
Re: Foreign key references are present for the record
Zitat:
Danka an alle. |
Re: Foreign key references are present for the record
Moin,
Zitat:
Zitat:
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 |
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:
Was soll nun mit den Personen geschehen, wenn z.B. die Augenfarbe blau gelöscht wird?
Augenfarben:
ID | Bezeichnung 1 blau 2 braun 3 grün Personen: ID | Name | Augenfarbe 1 Meier 1 2 Müller 2 3 Schulze 3 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:
Fall 3:
Augenfarben:
ID | Bezeichnung 2 braun 3 grün Personen: ID | Name | Augenfarbe 1 Meier NULL 2 Müller 2 3 Schulze 3
Code:
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.
Augenfarben:
ID | Bezeichnung 2 braun 3 grün Personen: ID | Name | Augenfarbe 2 Müller 2 3 Schulze 3 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:27 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-2025 by Thomas Breitkreuz