• Servus!


    Ich hab ein Problem: wenn ich versuch, in meine Tabelle Daten einzufügen, schreibt er voll oft


    'integrity constraint (U0203929.SYS_C00509220) violated - parent key not found'


    was heißt das und was mach ich dagegen??

  • Kurzes Beispiel:

    Code
    1. CREATE TABLE Verwaltungsstelle (
    2. ID NUMBER(4)
    3. );


    Code
    1. CREATE TABLE Person (
    2. SVNr NUMBER(10) PRIMARY KEY,
    3. Verwaltungsstelle NUMBER(4) REFERENCES Verwaltungsstelle (ID)
    4. );


    Wenn du jetzt versuchst, Daten in die Tabelle "Person" einzufügen, musst du die ID einer Verwaltungsstelle angeben. Diese Verwaltungsstelle muss bereits existieren. Wenn sie jedoch nicht existiert, bekommst du die genannte Fehlermeldung.

  • ja, das is mir klar. Ich bin auch genau bei diesem Beispiel. Bei mir referrenziert (sagt man das so??) Person auf Filiale und umgekehrt ebenso. Deswegen mach ich mal meine Person-Tabelle OHNE den Foreign Key auf Filiale, mach dann die Filiale-Tabelle MIT Foreign Key auf Person und will nachher nachträglich den Foreign Key von Person auf Filiale setzen. Und das mach ich doch mit einem constraint, richtig?


    Also, hier mal mein Code zur Veranschaulichung:



    Den Constraint kann ich auch abrufen, sprich er wird erstellt, aber ich weiß nicht, ob der Foreign Key jetzt gesetzt ist. Meiner Meinung nach ist er das nicht, sonst würd ich die Fehlermeldung nicht bekommen.


    Also, was mach ich falsch??

  • wenn du relationen hast, welche sich gegenseitig referenzieren, dann musst du beide inserts zumindest in einer transaktion durchführen.


    nachdem eine transaktion die datenbank von einem gültigen zustand in einen anderen gültigen zustand überführt, darf in diesem fall keine person ohne filiale und umgekehrt existieren (sozusagen eine instanz des henne-ei-problems).


    wenn ich mich recht erinnere, dann muss man im oracle den constraint aber "deferred" definieren, damit das funktioniert. dann wird der constraint erst am ende der transaktion im rahmen des commit geprüft.


    als workaround kannst du einen foreign key als NULL definieren. dann kannst du zuerst die inserts (in der richtigen reihenfolge = parents before children) machen und dann die foreign keys der children updaten.

  • Zitat von locutus

    wenn ich mich recht erinnere, dann muss man im oracle den constraint aber "deferred" definieren, damit das funktioniert. dann wird der constraint erst am ende der transaktion im rahmen des commit geprüft.


    als workaround kannst du einen foreign key als NULL definieren. dann kannst du zuerst die inserts (in der richtigen reihenfolge = parents before children) machen und dann die foreign keys der children updaten.


    bist deppad, is des kompliziert! kann man das irgendwie einfacher mit einer view auch lösen? Kenn mich mit views leider gar ned aus...

  • Zitat von Fat_Boy

    kann man das irgendwie einfacher mit einer view auch lösen?

    ein view liefert nur eine bestimmte ansicht des datenbankzustands. dieser zustand ist aber unabhängig von den views und muss nach wie vor den definierten constraints genügen.


    um die komplexität kommt man nicht herum, wenn man referential integrity haben will. der sinn dieser constraints ist es ja, die menge der gültigen datenbankzustände derart einzuschränken, sodass diese den gültigen zuständen des datenmodells entsprechen.


    constraints sind also nicht dazu da, den anwendern/studenten das leben schwer zu machen, sondern ihnen die arbeit der sicherstellung der referential integrity abzunehmen.