Announcement

Collapse
No announcement yet.

Integritäts-Constraint verletzt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Integritäts-Constraint verletzt

    Hallo,

    im Zuge eines Datenabgleiches werden u.a. auch neue Datensätze erstellt, die eine Referenz aus ich selbst haben können.

    z.B.
    INSERT INTO ort ( id, plz, ort, idpost ) VALUES ( 136746, '4776', 'Rainbach im Innkreis', 136743 )

    Beim Speichern dieses Datensatzes kommt dann der Fehler:
    ORA-02291: Integritäts-Constraint (USER.REF_postid) verletzt - übergeordneter Schlüssel nicht gefunden

    Ist soetwas grundsätzlich nicht möglich oder läßt sich das irgendwie umgehen?

    Danke
    Urwi

  • #2
    Du kannst den Constraint auf "Deferred" setzen (sofern er beim erzeugen als "deferrable" definiert wurde). Dann wird die Integrität erst beim COMMIT geprüft.
    Eine andere Möglichkeit ist, den Constraint auf "Disable" zu setzen. Danach die Daten einfügen und anschliessend wieder auf "Enable" setzen.

    Wenn die Daten stimmen, sollte es kein Problem damit geben.

    Gruss

    Comment


    • #3
      Hallo Wernfried,

      Danke für Deinen rasche Hilfe.

      Werde gleich einmal nach dem "Deferred" in der Doku nachsehen. Das erscheint mir der bessere Weg als das "Disable" zu sein, auch wenn ich sicher bin, dass die Daten stimmen.

      vg
      Urwi

      Comment


      • #4
        Eventuell ist auch DBMS_ERRLOG eine Alternative.
        Dann können die "integren" Datensätze eingefügt werden, die fehlerhaften werden in der definierten ERROR_LOG_TABLE protokolliert.
        Beispiel:
        Code:
        CREATE TABLE ort
         (id     NUMBER(10) PRIMARY KEY,
          plz    VARCHAR2(5),
          ort    VARCHAR2(50),
          idpost NUMBER(10));
          
        ALTER TABLE
           ort
        ADD CONSTRAINT
           ref_postid FOREIGN KEY (idpost)
        REFERENCES
           ort (id);
         
        --ok
        INSERT INTO ort ( id, plz, ort, idpost ) 
          VALUES        ( 136748, '4776', 'Rainbach im Innkreis', 136748);
        
        --ORA-02291: Integritäts-Constraint (USER.REF_POSTID) verletzt - übergeordneter Schlüssel nicht gefunden
        INSERT INTO ort ( id, plz, ort, idpost ) 
          VALUES        ( 136746, '4776', 'Rainbach im Innkreis', 136743);
        
        ROLLBACK;
        
        EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('ort', 'errlog');
        
        INSERT INTO ort ( id, plz, ort, idpost ) 
          VALUES        ( 136748, '4776', 'Rainbach im Innkreis', 136748)
           LOG ERRORS INTO errlog ('MyError')  REJECT LIMIT UNLIMITED;  
        
        INSERT INTO ort ( id, plz, ort, idpost )
          VALUES ( 136746, '4776', 'Rainbach im Innkreis', 136743 )
           LOG ERRORS INTO errlog ('MyError')  REJECT LIMIT UNLIMITED;
          
        SELECT * 
          FROM ort;    
        
        
                ID PLZ   ORT                                                 IDPOST
        ---------- ----- -------------------------------------------------- ----------
            136748 4776  Rainbach im Innkreis                                136748
        
        SELECT ( id, plz, ort, idpost )
          FROM errlog;    
         
             ID     PLZ  ORT                                                 IDPOST
        ---------- ----- -------------------------------------------------- ----------
        136746	4776	Rainbach im Innkreis	                             136743
        
        --clean up
        DROP   TABLE ort;
        
        DROP   TABLE errlog;

        Comment


        • #5
          Originally posted by jum View Post
          Eventuell ist auch DBMS_ERRLOG eine Alternative.
          Dann können die "integren" Datensätze eingefügt werden, die fehlerhaften werden in der definierten ERROR_LOG_TABLE protokolliert.
          Beispiel:
          Code:
          CREATE TABLE ort
           (id     NUMBER(10) PRIMARY KEY,
            plz    VARCHAR2(5),
            ort    VARCHAR2(50),
            idpost NUMBER(10));
            
          ALTER TABLE
             ort
          ADD CONSTRAINT
             ref_postid FOREIGN KEY (idpost)
          REFERENCES
             ort (id);
           
          --ok
          INSERT INTO ort ( id, plz, ort, idpost ) 
            VALUES        ( 136748, '4776', 'Rainbach im Innkreis', 136748);
          
          --ORA-02291: Integritäts-Constraint (USER.REF_POSTID) verletzt - übergeordneter Schlüssel nicht gefunden
          INSERT INTO ort ( id, plz, ort, idpost ) 
            VALUES        ( 136746, '4776', 'Rainbach im Innkreis', 136743);
          
          ROLLBACK;
          
          EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('ort', 'errlog');
          
          INSERT INTO ort ( id, plz, ort, idpost ) 
            VALUES        ( 136748, '4776', 'Rainbach im Innkreis', 136748)
             LOG ERRORS INTO errlog ('MyError')  REJECT LIMIT UNLIMITED;  
          
          INSERT INTO ort ( id, plz, ort, idpost )
            VALUES ( 136746, '4776', 'Rainbach im Innkreis', 136743 )
             LOG ERRORS INTO errlog ('MyError')  REJECT LIMIT UNLIMITED;
            
          SELECT * 
            FROM ort;    
          
          
                  ID PLZ   ORT                                                 IDPOST
          ---------- ----- -------------------------------------------------- ----------
              136748 4776  Rainbach im Innkreis                                136748
          
          SELECT ( id, plz, ort, idpost )
            FROM errlog;    
           
               ID     PLZ  ORT                                                 IDPOST
          ---------- ----- -------------------------------------------------- ----------
          136746	4776	Rainbach im Innkreis	                             136743
          
          --clean up
          DROP   TABLE ort;
          
          DROP   TABLE errlog;
          Hallo jum,

          Danke für Deinen Vorschlag!

          Ich habe inzwischen den Tipp von Wernfried realisiert, da er schnell und einfach umzusetzen war und es scheint zu funktionieren.

          Aber ich habe das in meine Tippsammlung aufgenommen. Wer weiß, wofür ich es noch brauchen kann.

          vg
          Urwi

          Comment

          Working...
          X