Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Referentielle Integrität in Access ohne Datensatz zu löschen (https://www.delphipraxis.net/115996-referentielle-integritaet-access-ohne-datensatz-zu-loeschen.html)

Overclocker 21. Jun 2008 12:32

Datenbank: access • Zugriff über: sql

Referentielle Integrität in Access ohne Datensatz zu löschen
 
Hi,

folgendes Problem:

Ich habe 2 Tabellen:

Tab: Kunden
KundenID
Name
Vorname
BLZ



Tab: Banken
BankID
BLZ
Bezeichnung


Wenn ich jetzt diese 2 Tabellen mit referentieller Integrität in Access verknüpfe und ich lösche den Datensatz mti der BankID 1 (diese Bank ist aber wiederum ein paar Kunden zugeordnet), dann löscht der mir ja auch alle Kunden-Datensätze wo diese BankID drinnen ist.

klar man könnte die löschweitergabe entfernen aber dann kann ich z.b. den Bank-Datensatz nicht löschen weil ne Meldung kommt.

Besteht auch die Möglichkeit dann z. B. eine 0 oder "Nicht vorhanden" in ein Feld dann zu schreiben damit der Datensatz nicht gelöscht wird?

Danke für die Hilfe

Bernhard Geyer 21. Jun 2008 12:35

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
Bei einem richtigen DBMS könntest du das per Trigger erledigen.
Bei Access würde ich erst ein Update-Statement auf die Kundentabelle loslassen

SQL-Code:
Update Kunden
set BLZ = NULL
where BLZ = <zu löschende ID>

Overclocker 21. Jun 2008 12:48

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
das mit dem update ist aber auch wieder ein problem.

wenn ich die anderen datensätze zuerst update, dann kommt ja auch wieder ein fehler weil ja in der banktabelle keine ID mit 0 vorhanden ist ;)

aber der ansatz war schon mal gut

Overclocker 21. Jun 2008 14:32

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
ich glaube ich werd da nicht um ein trigger rumkommen.

hab das ganze egntl nur gemacht, damit ich die datenbank schnell mal auf nen anderen pc ziehen kann um da weiterzuprogrammieren.

aber muss ich wohl auf nen sql server umziehen

mal ne andere frage: wenn ihr ein programm schreibt und dazu eine datenbank benötigt und das programm verkaufen wollt, welche möglichkeiten gibt es da das ganze so zu programmieren,dass ich das auf ne cd brennen kann,dann auf nen pc installieren und alles läuft ohne extra dbms oder sowas

DeddyH 21. Jun 2008 14:38

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
Zuerst einmal ist NULL <> 0. Und dann könntest Du eine Embedded DB (Firebird kann z.B. so betrieben werden) verwenden.

rotfc 21. Jun 2008 14:47

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
Für referentielle Integrität brauchen die beiden Tabellen ein gemeinsames Feld vom gleichen Datentyp, das nur von einer der beiden Tabellen bestückt werden darf.

Wenn 10 Kunden in der einen Tabelle die gleiche BLZ haben und man löscht die BLZ der Bank in der anderen Tabelle fliegen die 10 Kunden aus der ersten Tabelle raus.

Du hast 1:n-Beziehungen im Sinne von eine 1Bank kann nviele Kunden haben.

Mit ein paar Klicks in Access (Extras/Beziehungen) kannst Du die referentielle Integrität der beiden Tabellen untereinander aufheben. Dann hast Du zwei Tabellen, die nichts mehr miteinander zu tun haben.

Beachte, welche Abfragen Du unter Access gespeichert hast ;-)

HTH

DeddyH 21. Jun 2008 14:49

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
Ein Kunde kann aber auch bei mehreren Banken Konten haben.

Overclocker 21. Jun 2008 14:55

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
das ist eine 1:n beziehung lol da bin ich mir sicher :)

bankid ist autowert in der einen tabelle und in der anderen ist der datentyp eine zahl

also das ist schon richtig so, das ist eine 1:n beziehung da kenn ich mich schon aus.

DeddyH 21. Jun 2008 15:00

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
Ich weiß nicht, wie das in Access ist, aber bei der Definition eines Fremdschlüssels kann man doch angeben, was beim Löschen passieren soll (ON DELETE CASCADE | SET NULL).

rotfc 21. Jun 2008 15:21

Re: Referentielle Integrität in Access ohne Datensatz zu lös
 
Zitat:

Zitat von DeddyH
Ein Kunde kann aber auch bei mehreren Banken Konten haben.

Praktisch schon, wen Du 1:n aufgeben willst und zu Gruppensex (m:n) übergehen willst ;-)

Durch die beiden Kontonummern i.V. mit der BLZ hat der Kunde zwei "Primärschlüssel".

Über eine zusätzliche Tabelle lässt sich aber das auch lösen. Wobei der Primärschlüssel dann in der neuen Tabelle ist.

Nichts hasse ich mehr als Datenbanken, bei denen nachträglich (wegen falschem Lastenheft) der Primärschlüssel geändert werden muss! Da lob' ich mir Schäuble in den Fußstapfen von Schili!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 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