none
Datensätze ohne Fremdschlüssel trotz Ref. Integrität!?

    Frage

  • Hallo,

    in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs- und Löschweitergabe.

     

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

     

    Wie kann das sein...!?

     

    Danke für Eure Hilfe...

    Gruß Roland

    Donnerstag, 20. Januar 2011 11:54

Antworten

  • Hallo Roland
     
    Das ist keine Verletzung der Referentiellen Integrität. Wenn der Fremdschlüssel NULL ist, dann ist das in Jet erlaubt.
    Falls Du verhindern willst, dass das Feld NULL (leer) ist, musst Du dieses als NOT NULL deklarieren (oder Erforderlich/Required in der Entwurfsansicht der Tabelle aktivieren). Damit Du das bei Deinen Daten machen kannst, musst Du vorgängig die Datensätze, welche nun NULL drin haben, auf einen gültigen Wert aktualisieren (z.B. auf einen fiktiven Kontakt hängen) oder löschen, weil diese sowieso nirgendwohin verweisen.
     
    Hier die benötigten DDL Statements:
     
    DELETE FROM tblTelefon WHERE ContactCode IS NULL;
     
    Nun kannst Du das Feld auf NOT NULL umändern:
     
    ALTER TABLE tblTelefon ALTER COLUMN ContactCode LONG NOT NULL;
     
    (Den Datentypen LONG musst Du allenfalls durch den Datentypen ersetzen, den Du für die MasterID verwendet hast, falls das kein Long Integer ist)
     
    HTH
    Henry
     
     
     

    Hallo,

    in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs- und Löschweitergabe.

     

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

     

    Wie kann das sein...!?

     

    Danke für Eure Hilfe...

    Gru�? Roland

    • Als Antwort markiert Roland Klassen Mittwoch, 23. November 2011 11:54
    Montag, 24. Januar 2011 03:31

Alle Antworten

  • hallo Roland,

    in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft.

    D.h. [KontaktCode] ist Primärschlüssel in [tblKontakte]?

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

    SELECT  COUNT(*)
    FROM    [tblTelefon]
    WHERE   NOT [KontaktCode] IN ( SELECT   [KontaktCode]
                                   FROM     [tblKontakte] ) ;

    Liefert also 270?

    Klingt dann am ehesten nach Korruption.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 20. Januar 2011 12:23
    Moderator
  • Hallo!

    Roland Klassen schrieb:

    in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs-  und Löschweitergabe.

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

    Wenn das Feld leer ist, wird die RI nicht verletzt.
    Falls in dieser Tabelle keine Datensätze ohne passenden Datensatz in
    tblKontakte sein dürfen, müsstest du beim Fremdschlüsselfeld noch eine
    Eingabe erzwingen (Eingabe erforderlich = Ja).

    Möglicherweise wurden die Felder (durch Programmierfehler & Co.) auf
    NULL gesetzt bevor der Datensatz aus tblKontakte gelöscht wurde.
    Oder die Datensätze existierten bereits mit leeren Fremdschlüsselfeld,
    bevor die Löschweitergabe eingerichtet wurde.
    Vielleicht wurde auch eine Löschweitergabe in Form von "auf null
    setzen" eingestellt ... das kann man allerdings nur per SQL und nicht
    über die Oberfläche einstellen.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Donnerstag, 20. Januar 2011 12:36
  • in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs-  und Löschweitergabe.

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

    Wenn das Feld leer ist, wird die RI nicht verletzt.

        Aha, ich dachte, das wäre so...


    Falls in dieser Tabelle keine Datensätze ohne passenden Datensatz in
    tblKontakte sein dürfen, müsstest du beim Fremdschlüsselfeld noch eine
    Eingabe erzwingen (Eingabe erforderlich = Ja).

    Möglicherweise wurden die Felder (durch Programmierfehler & Co.) auf
    NULL gesetzt bevor der Datensatz aus tblKontakte gelöscht wurde.
    Oder die Datensätze existierten bereits mit leeren Fremdschlüsselfeld,
    bevor die Löschweitergabe eingerichtet wurde.
    Vielleicht wurde auch eine Löschweitergabe in Form von "auf null
    setzen" eingestellt ... das kann man allerdings nur per SQL und nicht
    über die Oberfläche einstellen.

        Ich denke mal, das die Datensätze dann so oder so ähnlich entstanden sind.

        Ich werde sie alle löschen und dann beobachten, ob wieder "leere" Datensätze entstehen.

        Vielen Dank für Eure Hilfe...

        Gruß Roland

        

    Donnerstag, 20. Januar 2011 13:01
  • Am 20.01.2011 schrieb Roland Klassen:

    in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs- 
     und Löschweitergabe.

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

    Und welches der beiden Felder in der tblTelefon hat den
    Primärschlüssel?

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Donnerstag, 20. Januar 2011 13:09
  • in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs- 
     und Löschweitergabe.

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

    Und welches der beiden Felder in der tblTelefon hat den
    Primärschlüssel?

        "KontaktCode" ist Primärschlüssel in der "tblKontakte", die "tblTelefon" hat einen eigenen Primärschlüssel "TelefonCode". Hier ist "KontakeCode" der Fremdschlüssel zu "tblKontakte".

        Gruß Roland

    Donnerstag, 20. Januar 2011 15:07
  • Am 20.01.2011 schrieb Roland Klassen:

    in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs- 
     und Löschweitergabe.

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

    Und welches der beiden Felder in der tblTelefon hat den
    Primärschlüssel?

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Donnerstag, 20. Januar 2011 15:21
  • Hallo Roland
     
    Das ist keine Verletzung der Referentiellen Integrität. Wenn der Fremdschlüssel NULL ist, dann ist das in Jet erlaubt.
    Falls Du verhindern willst, dass das Feld NULL (leer) ist, musst Du dieses als NOT NULL deklarieren (oder Erforderlich/Required in der Entwurfsansicht der Tabelle aktivieren). Damit Du das bei Deinen Daten machen kannst, musst Du vorgängig die Datensätze, welche nun NULL drin haben, auf einen gültigen Wert aktualisieren (z.B. auf einen fiktiven Kontakt hängen) oder löschen, weil diese sowieso nirgendwohin verweisen.
     
    Hier die benötigten DDL Statements:
     
    DELETE FROM tblTelefon WHERE ContactCode IS NULL;
     
    Nun kannst Du das Feld auf NOT NULL umändern:
     
    ALTER TABLE tblTelefon ALTER COLUMN ContactCode LONG NOT NULL;
     
    (Den Datentypen LONG musst Du allenfalls durch den Datentypen ersetzen, den Du für die MasterID verwendet hast, falls das kein Long Integer ist)
     
    HTH
    Henry
     
     
     

    Hallo,

    in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs- und Löschweitergabe.

     

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

     

    Wie kann das sein...!?

     

    Danke für Eure Hilfe...

    Gru�? Roland

    • Als Antwort markiert Roland Klassen Mittwoch, 23. November 2011 11:54
    Montag, 24. Januar 2011 03:31
  • in meiner DB (Access-2003) sind eine Mastertabelle "tblKontakte" und eine Detail-Tabelle "tblTelefon" über eine Beziehung mit referentieller Integrität des jeweiligen Feldes KontaktCode verknüpft. Es existiert eine Aktualisierungs- 
     und Löschweitergabe.

    Trotzdem existieren in der "tblTelefon" 270 Datensätze (von 21.000) ohne angegebenen KontaktCode im Feld des Fremdschlüssels.

       Und welches der beiden Felder in der tblTelefon hat den
       Primärschlüssel?

    Der Primärschlüssel der tblTelefon ist ein ganz anderer, nämlich ein eigenes Feld TelefonCode (AutoWert)...

    Der Fehler ist aber bis jetzt nicht mehr aufgetaucht...

    Danke + Grüße

    Roland

    Mittwoch, 23. November 2011 11:32
  • Das Problem ist bis jetzt nicht mehr aufgetaucht. Deshalb betrachte ich es 'mal optimistisch als gelöst. :-)

     

    Vielen Dank und liebe Grüße

    Roland

    Mittwoch, 23. November 2011 11:54