Announcement

Collapse
No announcement yet.

Fehler beim Anlegen eines FOREIGN KEY

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

  • Fehler beim Anlegen eines FOREIGN KEY

    <b>Hallo zusammen,</b><br><br>
    in einer Interbase-Datenbank existieren bereits verschiedene Tabellen, welche ich nun mittels <i>FOREIGN KEY</i>s referenzieren will. Dabei sind alle Tabellen wie folgt aufgebaut:<br><br>
    <i>create table Muster<br>
    (ID_Muster integer default 0 not null,<br>
    ID_Foreign integer default 0 not null,<br>
    ...,<br>
    constraint Muster_PK primary key(ID_Muster));</i><br><br>
    Der Ident <i>ID_Muster</i> wird über einen <i>GENERATOR</i> gesetzt. Nachdem alle Tabellen erstellt sind, will ich die <i>FOREIGN KEY</i>s mittels folgender Anweisung hinzufügen:<br><br>
    <i>alter table Muster add constraint Muster_FK foreign key(ID_Foreign)<br>
    references Muster2(ID_Muster2);</i><br><br>
    Dabei ist <i>ID_Muster2</i> der <i>PRIMARY KEY</i> von der Tabelle <i>Muster2</i>.<br><br>
    Einige <i>FOREIGN KEY</i>s kann ich problemlos anlegen, aber bei anderen bekomme ich folgende Fehlermeldung:<br><br>
    <font color=red><b>unsuccessful metadata update<br>
    STORE RDB$REF_CONSTRAINTS failed<br>
    action cancelled by trigger (1) to preserve data integrity<br>
    Name of Referential Constraint not defined in constraints table</b></font>
    <br><br>
    Ich bin schon eine Weile auf der Suche des Fehlers, vielleicht kann mir jemand hier weiterhelfen!<br><br>
    MfG<br>
    Carsten<br>

  • #2
    <b>Hallo zusammen,</b><br><br>
    nach einer umfangreichen Suche im Internet habe ich folgendes über diesen Fehler herausgefunden:<br><br>
    <font color=blue><b>Borland-Info</b></font><br>
    Es ist ein bekannter Fehler, der immer dann auftritt, wenn der <i>PRIMARY KEY</i> der Tabelle <i>Muster2</i> bereits auch als <i>FOREIGN KEY</i> auf einer anderen Tabelle referenziert.<br><br>
    So, nun gabs es aber keinen <i>FOREIGN KEY</i> in <i>Muster2</i>. Da hab ich in einem russischen Forum das gleiche Problem gefunden, und nach Auswertung derer SQL-Statements gab es für mich folgende Lösung.<br><br>
    <font color=blue><b>Lösung durch russisches Forum</b></font><br>
    Die Tabelle <i>Muster2</i> hatte auf den <i>PRIMARY KEY</i> einen <i>UNIQUE INDEX</i>, der von Interbase immer angelegt wird, und einen zusätzlichen <i>DESCENDING UNIQUE INDEX</i>, den ich selber angelegt habe.<br>
    Nach dem Entfernen des zweiten <i>INDEX</i> konnte ich den <i>FOREIGN KEY</i> anlegen. Das neue Erzeugen des <i>INDEX</i> nach dem Anlegen des <i>FOREIGN KEY</i>s ging dann problemlos.<br><br>
    Soweit sogut! Nun steht trotzdem noch folgende Frage im Raum:<br>
    <font color=red><b>Wieso konnte Interbase meinen <i>FOREIGN KEY</i> nicht anlegen ohne das ich den besagten <i>INDEX</i> entfernt habe?</b></font><br><br>
    MfG<br>
    Carsten<br&gt

    Comment


    • #3
      Carsten,<br><br>
      welche InterBase-Version verwendest Du? Macht es einen Unterschied wenn Du den DESCENDING INDEX nicht als UNIQUE deklarierst und anschließend den FOREIGN KEY Constraint anlegst?<br><br>
      Gruss,<br>
      Thoma
      Thomas Steinmaurer

      Firebird Foundation Committee Member
      Upscene Productions - Database Tools for Developers
      Mein Blog

      Comment


      • #4
        <b>Hallo Thomas,</b><br><br>
        also ich arbeite mit Interbase 6.0.<br><br>
        Ich habe mal folgendes ausprobiert:<ul>
        <li><i>drop index Muster2_idx;</i></li>
        <li><i>create descending index Muster2_idx on Muster2(ID_Muster2);</i> (kein <i>unique</i>)</li>
        <li><i>alter table Muster add constraint Muster_FK foreign key(ID_Foreign) references Muster2(ID_Muster2);</i></li>
        </ul>
        Das scheint zu funktionieren, also lag es am <i>unique</i>. Nur kann ich mir darauf keinen Reim machen.<br><br>
        MfG,<br>
        Carsten<br&gt

        Comment


        • #5
          Hallo Carsten,<br><br>
          also haben mich meine grauen Zellen doch nicht im Stich gelassen ;-). Mir war diesbzgl. etwas in Erinnerung, wenn auf einem Primary-Key zusätzlich ein UNIQUE DESCENDING Index definiert wurde. Das UNIQUE ist für den zusätzlichen Index nicht notwendig, weil dies bereits durch den PRIMARY KEY Constraint sichergestellt wird, aber das sollte keine negative Auswirkung auf das Anlegen eines FOREIGN KEYs haben, d.h. ich würde das als Bug bezeichnen. Welche InterBase Version genau? 6.0.1.0, 6.0.1.6 oder 6.0.2.0?<br><br>
          Gruss,<br>
          Thoma
          Thomas Steinmaurer

          Firebird Foundation Committee Member
          Upscene Productions - Database Tools for Developers
          Mein Blog

          Comment


          • #6
            <b>Hallo Thomas,</b><br><br>
            die genaue Interbase-Version ist 6.0.1.0.<br><br>
            Also wenn das alles ein Bug ist, habe ich noch eine Frage. Wie im zweiten Kommentar erklärt, funktioniert es, wenn ich den Index erst nach dem Fremdschlüssel anlege (auch als <i>unique</i>). Hat dieser Bug dann Auswirkungen auf die Performance und Funktionalität der Datenbank?<br><br>
            MfG,<br>
            Carsten<br&gt

            Comment


            • #7
              Hallo Carsten,<br><br>
              &gt; die genaue Interbase-Version ist 6.0.1.0<br><br>
              wenn irgendwie möglich unbedingt auf 6.0.1.6 updaten, da 6.0.1.0 eine sehr frühe Version von IB 6.0 darstellt, und 6.0.1.6 als die stabilste IB 6.0 Open-Edition Version angesehen werden kann.<br><br>
              Ich kann jetzt nicht mit Sicherheit sagen, ob z.B. der Optimizer verwirrt wird, wenn der DESCENDING Index auch als UNIQUE angelegt wurde. Ich würde Dir empfehlen einen zusätzlichen DESCENDING Index auf einem Primärschlüsselfeld nicht als UNIQUE zu deklarieren, so mach ich es zumindest, weil die Eindeutigkeit bereits durch den PRIMARY KEY Constraint festgelegt wurde.<br><br>
              Gruss,<br>
              Thoma
              Thomas Steinmaurer

              Firebird Foundation Committee Member
              Upscene Productions - Database Tools for Developers
              Mein Blog

              Comment


              • #8
                <b>Hallo Thomas,</b><br><br>
                danke für die Tips. Ich werde dann mal sehen, dass ich die Interbase-Version update.<br><br>
                Aber ich habe mich jetzt auch entschieden, dass ich die <i>descending index</i>e nach dem Erzeugen der <i>foreign key</i>s anlege. Das klappt ja.<br><br>
                MfG,<br>
                Carsten<br&gt

                Comment

                Working...
                X