# Error 1452: Cannot add or update a child row: a foreign key constraint fails



## dogano (21. Mai 2012)

Hallo liebe Gemeinde,

Ich habe ein kleines Problem, was ich nicht auf die Reihe kriege..
Ich kriege eine Fehlermeldung, mit der ich nichts zu anfangen weiß:



```
insert into leasing values(2,"Apple","Jobs","01.01.01","01.01.01","01.01.01","01.01.01","763,76€",2,2,3,2,3)	
Error Code: 1452. Cannot add or update a child row: 
a foreign key constraint fails (`mydb`.`leasing`, CONSTRAINT `fk_Leasing_Lizenz1` 
FOREIGN KEY (`Lizenz_Lizenz_ID`, `Lizenz_PerKu_PerKu_ID`, `Lizenz_Produkt_Produkt_ID`) 
REFERENCES `lizenz` (`Lizenz_ID`, `PerKu_PerKu_ID`, `Pr)
```

Weiß einer woran das liegt? Ich habe mal gelesen dass man die Elterntabellen(in dme Fall Perku,Lizenz und Produkt) füllen muss bevor man die Kindtabelle füllen kann. Aber ich hab in jeder Tabelle 7 Einträge und kann trotzdem hier nicht mehr als einen Eintrag machen.

Ich freu mich über jede Antwort..

Liebe Grüße,

dogano


----------



## SlaterB (21. Mai 2012)

poste die Tabellendefintion mit ihren Fremdschlüsseln und die vorhandenen Werte in den anderen Tabellen,
du versuchst irgendwas einzufügen, was nicht gefällt,
von außen kann man nicht wissen welcher der 13 Werte das ist

normale Anführungszeichen sehen in jedem Fall verdächtig aus, verwendest du das wirklich so wie hier gepostet?
funktionieren anderen Inserts, hast du für diese Tabelle ein funktionierendes Beispiel?


----------



## HimBromBeere (21. Mai 2012)

> Ich habe mal gelesen dass man die Elterntabellen(in dme Fall Perku,Lizenz und Produkt) füllen muss bevor man die Kindtabelle füllen


Naja, du kannst halt in deiner "Kindtabelle" keine Fremdschlüssel verwenden, die es in der "Elterntabelle" noch gar nich gibt. Heißt: du musst erstmal den Primärschlüssel erstellen um dann auf ihn verweisen zu können.


----------



## dogano (22. Mai 2012)

Hallo,

Tabellendefinition "Leasing":

Leasing_ID Int PK, NN
Ansprech_FiKu  VARCHAR(30)
Ansprech_PerKu VARCHAR(30)
Vertragsbeginn Date
Datum_erste_Rechnung Date
Datum_letzte_Rechnung Date
Datum_nachste_Rechnung Date
Betrag_Rechnung VARCHAR(10)
Anz_Rechnung Int
Fiku_Fiku_ID Int
Lizenz_Perku_ID Int
Lizenz_Produkt_ID

Die letzten 3 sind Fremdschlüssel. Der erste Fremdschlüssel kommt aus der Tabelle "Fiku", der zweite aus Lizenz und der dritte auch. Ich habe in allen drei Tabellen 7 Einträge.

Ein Insert in die Tabelle "Leasing" hat funktioniert. Andere bringen die genannte Fehlermeldung. Die Hochkommas haben bisher immer funktioniert, egal ob VARCHAR oder DATE..


----------



## HimBromBeere (22. Mai 2012)

> Ich habe in allen drei Tabellen 7 Einträge.


Wie viele Einträge deine Tabellen haben, ist völlig wurscht, wichtig ist nur, dass die Schlüssel, auf die verwiesen wird, auch existieren. Gibt es in deiner Tabelle "Fiku" denn eine Entität mit der ID 3 und in der "Lizenz" je eine mit ID 2 und 3?


```
FOREIGN KEY (`Lizenz_Lizenz_ID`, `Lizenz_PerKu_PerKu_ID`, `Lizenz_Produkt_Produkt_ID`) REFERENCES `lizenz` (`Lizenz_ID`, `PerKu_PerKu_ID`, `Pr)
```
Das klingt mir hier aber auch irgendwie so, als würdest du eben nicht die Tabelle "Fiku" verwenden, sondern die drei Fremdschlüssel ausschließlich in der Tabelle "Lizenz" suchen.

[EDIT]Von welchem DBS reden wir hier eigtl.?[/EDIT]


----------



## SlaterB (22. Mai 2012)

in der Tabellen-Definition sind nur 4 Attribute nach Betrag_Rechnung genannt, im SQL hast du aber mit 2,2,3,2,3 fünf Zahlen nach dem Euro-Betrag?

ist der Fremschlüssel auf die eigene Tabelle auf einen schon vorhandenen oder gar den aktuell eingefügten Eintrag?

du sagst dass in allen Tabellen 7 Einträge vorhanden sind, auch in Leasing? aber Id 2 ist noch frei für den neuen Eintrag?

führe evtl. in dem Programmabschnitt, in dem du das Insert ausführst, einen manuellen Check der Fremdschlüssel durch,
wenn du 2 für Fiku_Fiku_ID hast, dann schaue an, ob bei 'select .. from fiku where id = 2' was rauskommt usw.,

setze die Spalten temporär auf 'null erlaubt', bzw. sind sie ja schon wenn nicht NN,
füge den Eintrag ohne Fremdschlüssel ein, setze danach einzeln die Fremdschlüssel,
geht das oder bei welchem kommt die Fehlermeldung?


----------



## dogano (22. Mai 2012)

HimBromBeere hat gesagt.:


> Wie viele Einträge deine Tabellen haben, ist völlig wurscht, wichtig ist nur, dass die Schlüssel, auf die verwiesen wird, auch existieren. Gibt es in deiner Tabelle "Fiku" denn eine Entität mit der ID 3 und in der "Lizenz" je eine mit ID 2 und 3?



Ja, sind alle vorhanden. Wie gesagt einen Eintrag in Leasing habe ich ja schon...



HimBromBeere hat gesagt.:


> ```
> FOREIGN KEY (`Lizenz_Lizenz_ID`, `Lizenz_PerKu_PerKu_ID`, `Lizenz_Produkt_Produkt_ID`) REFERENCES `lizenz` (`Lizenz_ID`, `PerKu_PerKu_ID`, `Pr)
> ```
> Das klingt mir hier aber auch irgendwie so, als würdest du eben nicht die Tabelle "Fiku" verwenden, sondern die drei Fremdschlüssel ausschließlich in der Tabelle "Lizenz" suchen.



nee, fiku_fiku_id verweist auf die tabelle fiku. Die anderen beiden auf die tabelle lizenz.



HimBromBeere hat gesagt.:


> [EDIT]Von welchem DBS reden wir hier eigtl.?[/EDIT]



Ich arbeite mit MySQL Workbench und XAMPP


----------



## dogano (22. Mai 2012)

SlaterB hat gesagt.:


> in der Tabellen-Definition sind nur 4 Attribute nach Betrag_Rechnung genannt, im SQL hast du aber mit 2,2,3,2,3 fünf Zahlen nach dem Euro-Betrag?



Ich habe als Fremdschlüssel "Lizenz_Lizenz_ID" vergessen. Der ist auch noch dabei.. Die Einträge in SQL sind also richtig..



SlaterB hat gesagt.:


> ist der Fremschlüssel auf die eigene Tabelle auf einen schon vorhandenen oder gar den aktuell eingefügten Eintrag?



wie meinst du das?



SlaterB hat gesagt.:


> du sagst dass in allen Tabellen 7 Einträge vorhanden sind, auch in Leasing? aber Id 2 ist noch frei für den neuen Eintrag?



ne eben nicht! Ich habe einen Eintrag in leasing machen können, danach kommt die genannte Fehlermeldung..



SlaterB hat gesagt.:


> führe evtl. in dem Programmabschnitt, in dem du das Insert ausführst, einen manuellen Check der Fremdschlüssel durch,
> wenn du 2 für Fiku_Fiku_ID hast, dann schaue an, ob bei 'select .. from fiku where id = 2' was rauskommt usw.,



ICh hab mit Workbench und mit der grafischen Oberfläche versucht einen Eintrag zu machen aber geht beides nicht.. Ich bekomm die Fehlermeldung



SlaterB hat gesagt.:


> setze die Spalten temporär auf 'null erlaubt', bzw. sind sie ja schon wenn nicht NN,
> füge den Eintrag ohne Fremdschlüssel ein, setze danach einzeln die Fremdschlüssel,
> geht das oder bei welchem kommt die Fehlermeldung?



versuche ich gleich mal...


----------



## SlaterB (22. Mai 2012)

> wie meinst du das?

welche Werte zu welchen Fremdschlüsseln gedacht sind, kann ich nicht gut erkennen, 
ist der Fremdschlüssel auf die eigene Tabelle 2 so wie der gerade eingefügte Eintrag 2, 
oder ist der Fremdschlüssel auf einen anderen schon vorhandenen Eintrag, etwa 3?

------

die Fehlermeldung im ersten Posting habe ich jetzt erst entdeckt, gleich bisschen editiert für bessere Erkennung,
richtig schlau werde ich daraus aber nicht, was mag 'PerKu_PerKu_ID' sein oder auch 'Lizenz_PerKu_PerKu_ID'?


----------



## dogano (22. Mai 2012)

Nee die fremdschlüssel sind unabhängig zu dem jetzigen Eintrag. Durch die fremdschlüssel soll eindeutig erkannt werden welches Produkt mit welcher Lizenz an welchen fiku verkauft wurde(fuku für Firmenkunde).

Perku_perku_id ist der primärschlussel perku_id in der Tabelle perku. (perku für personenkunde)  Die fremdschlüssel wurden von workbench automatisch gemacht, wenn man beziehungen aufgebaut hat. So auch die Namen..

Ich kann mit der Fehlermeldung gar nix anfangen ...


----------



## dogano (22. Mai 2012)

Hallo,

nun ich habe sowieso ein paar Änderungen an dem ganzen Datenbankkonzept vornehmen müssen und so dachte ich mir, ich lösche das vorhandene Schema und mache es noch einmal neu. Ich hab also "DROP SCHEMA MYDB" gemacht und ein neues ER-Diagramm gezeichnet, um daraus die DB zu erstellen. Bei Workbench kann man sich anschließend den Code generieren lassen; dies habe ich getan und ich bekomme jedes mal eine Fehlermeldung. Interessanterweise wieder bei der Tabelle "Leasing". Hier erst mal der Code:


```
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`FiKu`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`FiKu` (
  `FiKu_ID` INT NOT NULL ,
  `Name` VARCHAR(30) NULL ,
  `Gesellschaftsform` VARCHAR(45) NULL ,
  `Webseite` VARCHAR(20) NULL ,
  `TelNr` VARCHAR(20) NULL ,
  `Fax` VARCHAR(20) NULL ,
  `LoeschFlag` TINYINT(1) NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`FiKu_ID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Standort`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Standort` (
  `Standort_ID` INT NOT NULL ,
  `Stadt` VARCHAR(30) NULL ,
  `Straße` VARCHAR(30) NULL ,
  `Hausnummer` INT NULL ,
  `PLZ` INT NULL ,
  `FiKu_FiKu_ID` INT NOT NULL ,
  `LoeschFlag` TINYINT(1) NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`Standort_ID`) ,
  INDEX `fk_Standort_FiKu1` (`FiKu_FiKu_ID` ASC) ,
  CONSTRAINT `fk_Standort_FiKu1`
    FOREIGN KEY (`FiKu_FiKu_ID` )
    REFERENCES `mydb`.`FiKu` (`FiKu_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`PerKu`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`PerKu` (
  `PerKu_ID` INT NOT NULL ,
  `Arbeitsplatz` VARCHAR(30) NULL ,
  `Abteilung` VARCHAR(30) NULL ,
  `Geb-Nr` VARCHAR(10) NULL ,
  `Zim-Nr` VARCHAR(5) NULL ,
  `TelNr` VARCHAR(20) NULL ,
  `Fax` VARCHAR(20) NULL ,
  `Email` VARCHAR(15) NULL ,
  `Position` VARCHAR(15) NULL ,
  `Anrede` VARCHAR(10) NULL ,
  `Nachname` VARCHAR(20) NULL ,
  `Vorname` VARCHAR(20) NULL ,
  `Standort_Standort_ID` INT NOT NULL ,
  `LoeschFlag` TINYINT(1) NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`PerKu_ID`) ,
  INDEX `fk_PerKu_Standort1` (`Standort_Standort_ID` ASC) ,
  CONSTRAINT `fk_PerKu_Standort1`
    FOREIGN KEY (`Standort_Standort_ID` )
    REFERENCES `mydb`.`Standort` (`Standort_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Produkt`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Produkt` (
  `Produkt_ID` INT NOT NULL ,
  `Name` VARCHAR(20) NULL ,
  `Versionsnummer` VARCHAR(15) NULL ,
  `Listenpreis` VARCHAR(20) NULL ,
  `Systemvoraussetzungen` VARCHAR(45) NULL ,
  `LoeschFlag` TINYINT(1) NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`Produkt_ID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Lizenz`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Lizenz` (
  `Lizenz_ID` INT NOT NULL ,
  `InstSchluessel` VARCHAR(45) NULL ,
  `Status` VARCHAR(20) NULL ,
  `MainInfo` VARCHAR(10) NULL ,
  `Rabatt` VARCHAR(10) NULL ,
  `VerkDatum` DATETIME NULL ,
  `AblDatum` DATETIME NULL ,
  `UpgInfo` VARCHAR(20) NULL ,
  `PerKu_PerKu_ID` INT NOT NULL ,
  `Produkt_Produkt_ID` INT NOT NULL ,
  `LoeschFlag` TINYINT(1) NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`Lizenz_ID`) ,
  INDEX `fk_Lizenz_PerKu1` (`PerKu_PerKu_ID` ASC) ,
  INDEX `fk_Lizenz_Produkt1` (`Produkt_Produkt_ID` ASC) ,
  CONSTRAINT `fk_Lizenz_PerKu1`
    FOREIGN KEY (`PerKu_PerKu_ID` )
    REFERENCES `mydb`.`PerKu` (`PerKu_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Lizenz_Produkt1`
    FOREIGN KEY (`Produkt_Produkt_ID` )
    REFERENCES `mydb`.`Produkt` (`Produkt_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Leasing`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Leasing` (
  `Leasing_ID` INT NOT NULL ,
  `Ansprech_FiKu` VARCHAR(30) NULL ,
  `Ansprech_PerKu` VARCHAR(30) NULL ,
  `Vertragsbeginn` DATETIME NULL ,
  `Datum_erste_Rechnung` DATETIME NULL ,
  `Datum_letzte_Rechnung` DATETIME NULL ,
  `Datum_naechste_Rechnung` DATETIME NULL ,
  `Betrag_Rechnung` VARCHAR(10) NULL ,
  `Anzahl_Rechnung` INT NULL ,
  `FiKu_FiKu_ID` INT NOT NULL ,
  `Lizenz_Lizenz_ID` INT NOT NULL ,
  `Lizenz_PerKu_PerKu_ID` INT NOT NULL ,
  `Lizenz_Produkt_Produkt_ID` INT NOT NULL ,
  `LoeschFlag` TINYINT(1) NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`Leasing_ID`) ,
  INDEX `fk_Leasing_FiKu1` (`FiKu_FiKu_ID` ASC) ,
  INDEX `fk_Leasing_Lizenz1` (`Lizenz_Lizenz_ID` ASC, `Lizenz_PerKu_PerKu_ID` ASC, `Lizenz_Produkt_Produkt_ID` ASC) ,
  CONSTRAINT `fk_Leasing_FiKu1`
    FOREIGN KEY (`FiKu_FiKu_ID` )
    REFERENCES `mydb`.`FiKu` (`FiKu_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Leasing_Lizenz1`
    FOREIGN KEY (`Lizenz_Lizenz_ID` , `Lizenz_PerKu_PerKu_ID` , `Lizenz_Produkt_Produkt_ID` )
    REFERENCES `mydb`.`Lizenz` (`Lizenz_ID` , `PerKu_PerKu_ID` , `Produkt_Produkt_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Maintenance`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Maintenance` (
  `Maintenance_ID` INT NOT NULL ,
  `Preis` VARCHAR(10) NULL ,
  `Anfang` DATETIME NULL ,
  `Ende` DATETIME NULL ,
  `Lizenz_Produkt_Produkt_ID` INT NOT NULL ,
  `LoeschFlag` TINYINT(1) NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`Maintenance_ID`) ,
  INDEX `fk_Maintenance_Lizenz1` (`Lizenz_Produkt_Produkt_ID` ASC) ,
  CONSTRAINT `fk_Maintenance_Lizenz1`
    FOREIGN KEY (`Lizenz_Produkt_Produkt_ID` )
    REFERENCES `mydb`.`Lizenz` (`Produkt_Produkt_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Verkauf`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Verkauf` (
  `Verkauf_ID` INT NOT NULL ,
  `FiKu_FiKu_ID` INT NOT NULL ,
  `Lizenz_Lizenz_ID` INT NOT NULL ,
  PRIMARY KEY (`Verkauf_ID`) ,
  INDEX `fk_Verkauf_FiKu1` (`FiKu_FiKu_ID` ASC) ,
  INDEX `fk_Verkauf_Lizenz1` (`Lizenz_Lizenz_ID` ASC) ,
  CONSTRAINT `fk_Verkauf_FiKu1`
    FOREIGN KEY (`FiKu_FiKu_ID` )
    REFERENCES `mydb`.`FiKu` (`FiKu_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Verkauf_Lizenz1`
    FOREIGN KEY (`Lizenz_Lizenz_ID` )
    REFERENCES `mydb`.`Lizenz` (`Lizenz_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
```

Dabei bekomm ich diese Fehlermeldung: 


```
'Error', '1005', 'Can''t create table ''mydb.#sql-1e6_2'' (errno: 150)'
```

Ich habe im Internet gelesen, dass die Datentypen der Primär- und Fremdschlüssel gleich sein müssen. Das habe ich alles korrigiert aber die Fehlermeldung bleibt.. Bitte um Hilfe..


----------



## SlaterB (22. Mai 2012)

bevor es gar keine Tipps gibt von mir Standard-Antworten:
- einzeln versuchen, weniger Spalten, erst nach und nach ergänzen usw.
- MySQL-Forum?

------

wenn in Lizenz die LizenzId der PK ist, reicht das doch als Fremdschlüssel, wieso so kompliziert ein 3er?

----

MySQL :: MySQL 5.1 Reference Manual :: 14.6.4.4 FOREIGN KEY Constraints


> If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.


----------



## dogano (22. Mai 2012)

Wie erwähnt, der Code wurde automatisch generiert... Ich hab bei Leasing die fremdschlüssel Definition rausgeholt. So ging's aber später als ich alter table add foreign Key grmacht habe, kam so ziemlich sie gleiche Meldung..


----------



## dogano (22. Mai 2012)

SlaterB hat gesagt.:


> MySQL :: MySQL 5.1 Reference Manual :: 14.6.4.4 FOREIGN KEY Constraints



Ich habe das gelesen aber werde dadurch nicht wirklich schlau.. kann mir denn keiner helfen?? bitte, es ist sehr wichtig..


----------



## SlaterB (22. Mai 2012)

einmal mehr, weil du dich meldest: MySQL-Forum,
das ist keine Java-Frage, wieviele hier handeln schon täglich mit MySQL-Datenbanken, 
probieren mal eben neue Schemen aus, sind Experte für Fremdschlüssel-Definition?

ich könnte deine SQL-Creates gerade nichtmal testen, ok andere hier wohl schon,
aber in anderen Foren wäre das fast eine Standard-Frage wie hier die nach einer for-Schleife..


----------



## dogano (23. Mai 2012)

Hallo,

die Sache hat sich geklärt.. Ich hatte komische Fremdschlüsseleinträge in Leasing. Ich hab die Beziehung einmal gelöscht(in dem Er-Diagramm) und neu gesetzt. Siehe da, es hat funktioniert!

Zur Sache mit SQL-Forum: Naja, auch wenn es jetzt nicht direkt etwas mit Java zutun hatte, war es doch im Zusammenspiel mit Java also JDBC. Von daher habe ich hier rein gepostet..

Danke euch allen aber trotzdem für die Mühe!


----------

