# INSERT-Problem = integrity constraint violation: foreign key no parent



## MarDaiBre (19. Sep 2014)

Hallo,

ich habe folgendes Problem:

Ich möchte mittels Methode eingegebene Formulardaten (aus einem Java-Programm) in eine Tabelle "Verursacherrisiko" in einer MS Access-Datenbank speichern. Meine Methode funktioniert im Grundsatz auch, da es bei einem anderen Formular im gleichen Programm bereits einwandfrei funktioniert.

Nun bekomme ich jedoch bei dem zweiten Formular den Fehler, dass eine Verletzung der Integrität bei Zeile 456 vorliegt (model.getOid()). Der in die Datenbankspalte einzufügende Text muss (so die Einschränkung) einen Parent Key in einer anderen Tabelle besitzen. Ich habe dazu für die Beziehung der Tabellen in MS Access Integritätseinschränkungen festgelegt - wenn ich diese rausnehme, dann funktioniert es auch, jedoch brauche ich diese Einschränkungen. Nehme ich die Einschränkung für die Beziehung zwischen den Tabellen "Verursacherrisiko" und "Bauteil" raus, dann schreit er bei model.getAid().

Interessant ist aus meiner Sicht nur, dass er ohne Probleme den vorherigen Schritt model.getVid() durchführt, obwohl der gleiche Aufbau und die gleiche Integritätseinschränkung vorhanden ist.

Hat da jemand eine Idee?

Vielen Dank schonmal vorab!


----------



## stg (19. Sep 2014)

Du kannst ein "Verursacherrisiko" natürlich nur persistieren _nachdem_ Bauteil, Fehlerart, Quadrant und Verursacher schon in der Datenbank liegen. Offenbar ist das hier aber (wenigstens bei Bauteil und Fehlerart) nicht der Fall.

Unabhängig davon würde ich das an deiner Stelle nicht von Hand codieren, sondern auf JPA zurückgreifen.


----------



## MarDaiBre (19. Sep 2014)

Danke für den Hinweis. Also die Oid 98152 (Bauteil) liegt bereits in der Tabelle Bauteil als Datensatz vor, genau wie die einzutragende Aid 10 (Fehlerart) schon in der Tabelle Fehlerart vorliegt. Daher wundert es mich ganz besonders, dass es bei Vid 1111 (Verursacher) einwandfrei läuft, obwohl die Beziehungen von der Struktur identisch sind.

In der Tabelle Verursacherrisiko sind bereits Datensätze vorhanden (per Hand eingetragen). Wenn ich nun die gleichen Werte mit meiner Methode einfügen möchte (nur den Primärschlüssel Rid anders), dann bekomme ich den besagten Fehler. :bahnhof:

Ich schau mal nach JPA. Besten Dank!


----------



## MarDaiBre (19. Sep 2014)

Hey, also ich habe den Fehler entdeckt:
Die Konsolenausgabe hat zwar den INSERT-Befehl in der gewünschten/richtigen Reihenfolge ausgegeben, jedoch komischerweise wurden die Werte für den Insert in einer anderen Reihenfolge der Datenbank übergeben.

Gewünscht (und per System.out.println) war: INSERT INTO Verursacherrisiko VALUES ('R99', '1111', '98152', 'Q1.1', '10', 'Ursache', 'Werkzeug');

Nachdem ich nochmal die komplette Integrität rausgenommen habe, merkte ich, dass in einer ganz anderen Reihenfolge importiert wurde. Nach dem Verursacher (daher hat das auch bei dem problemlos geklappt) wurde dann die Ursache importiert, dann das Werkzeug und dann erst die Oid (Bauteil). Dass es keine Oid mit dem Namen "Ursache" in der Tabelle Bauteil gibt, ist logisch und daher auch der Fehler.

Ich habe nun den INSERT-Befehl konkretisiert: INSERT INTO Verursacherrisiko (R_ID, V_ID, B_ID, Q_ID, A_ID, ...) VALUES (...);

Nun klappt alles! Danke nochmals!


----------



## stg (19. Sep 2014)

Das habe ich in deinem ersten Post ganz übersehen :-O

Auf die Reihenfolge solltest du dich generell nie verlassen. Nicht beim Insert und auch nicht beim select, update ... Sofern du die Statements wirklich händisch selbst schreibst, solltest du grundsätzlich IMMER explizit die Spaltennamen angeben.


----------



## MarDaiBre (19. Sep 2014)

Ja, das hat mir sehr viel Zeit geraubt. Verstehe aber auch nicht, warum es nicht so importiert wird, wie angegeben. Warum so durcheinander?


----------

