Results 1 to 7 of 7

Thread: constraints

  1. #1
    Fat_Boy's Avatar
    Title
    Hero
    Join Date
    Nov 2002
    Location
    1050
    Posts
    247
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    constraints

    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??
    If I had to explain, you wouldn't understand!

  2. #2
    Paulchen's Avatar
    Title
    Super Moderator
    Join Date
    Oct 2004
    Location
    /home/paulchen
    Posts
    8,104
    Thanks Thanks Given 
    1,956
    Thanks Thanks Received 
    1,465
    Thanked in
    1,002 Posts
    Kurzes Beispiel:
    Code:
    CREATE TABLE Verwaltungsstelle (
        ID NUMBER(4)
    );
    Code:
    CREATE TABLE Person (
        SVNr NUMBER(10) PRIMARY KEY,
        Verwaltungsstelle NUMBER(4) REFERENCES Verwaltungsstelle (ID)
    );
    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.

  3. #3
    Fat_Boy's Avatar
    Title
    Hero
    Join Date
    Nov 2002
    Location
    1050
    Posts
    247
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    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:

    Code:
    CREATE TABLE Personal (
    SVNR CHAR (12) NOT NULL,
    Nr CHAR (10) NOT NULL,
    arbeitetinnr CHAR (4),
    PRIMARY KEY (SVNR),
    );
    
    CREATE TABLE Filiale (
    Filialnr CHAR (4) NOT NULL,
    Adresse VARCHAR (50) NOT NULL,
    Leiter CHAR (10),
    PRIMARY KEY (Filialnr),
    FOREIGN KEY (Leiter) REFERENCES Personal (SVNR)
    );
    
    ALTER TABLE Personal 
    Add constraint ck1 FOREIGN KEY (arbeitetinnr) REFERENCES Filiale (Filialnr);
    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??
    If I had to explain, you wouldn't understand!

  4. #4
    locutus's Avatar
    Title
    Baccalaureus
    Join Date
    May 2003
    Location
    borg collective
    Posts
    509
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    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.
    we are the borg ... you will be assimilated ... resistance is futile

  5. #5

    Title
    Elite
    Join Date
    Oct 2004
    Location
    Wien
    Posts
    365
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    4
    Thanked in
    2 Posts
    wenn du die angabe ganz genau liest, wirst du feststellen, dass ein filialleiter nicht zum personal gehören muss. das problem kann man also leicht umgehen.

    -Thomas

  6. #6
    Fat_Boy's Avatar
    Title
    Hero
    Join Date
    Nov 2002
    Location
    1050
    Posts
    247
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by 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...
    If I had to explain, you wouldn't understand!

  7. #7
    locutus's Avatar
    Title
    Baccalaureus
    Join Date
    May 2003
    Location
    borg collective
    Posts
    509
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by 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.
    we are the borg ... you will be assimilated ... resistance is futile

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •