Fehler: 1452 - Cannot add or update a child row:

Hallo Zusammen

Ich weiss mir nicht mehr zu helfen und hoffe, dass jemand von Euch die Antwort kennt. Und zwar erhalte ich die Fehlermeldung:

Fehler: 1452 - Cannot add or update a child row: a foreign key constraint fails (weiterbildung/modul, CONSTRAINT
modul_ibfk_1 FOREIGN KEY (idmodul) REFERENCES modulart (idmodulart) ON DELETE CASCADE ON
UPDATE CASCADE)

Ich arbeite mit Mysql 5.0.15. Die Fehlermeldung erscheint, wenn man bei der Kindtabelle eine Zeile mehr hinzufügen möchte als bei der Vatertabelle vorhanden ist.

Der Code sieht so aus, habe aber auch schon andere Testtabellen mit dem gleichen Phänomen erstellt:

Table „modul“ DDL

CREATE TABLE modul (
idmodul int(10) unsigned NOT NULL auto_increment,
modulnr varchar(10) default NULL,
modulbezeichnung varchar(40) default NULL,
fkmodulart int(10) default NULL,
fkfachrichtung int(10) default NULL,
fkunterrichtszeit int(10) default NULL,
PRIMARY KEY ( idmodul ),
CONSTRAINT modul_ibfk_1 FOREIGN KEY ( idmodul ) REFERENCES modulart ( idmodulart ) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT modul_ibfk_2 FOREIGN KEY ( idmodul ) REFERENCES fachrichtung ( idfachrichtung ) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT modul_ibfk_3 FOREIGN KEY ( idmodul ) REFERENCES unterrichtszeit ( idunterricht ) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

Table „modulart“ DDL

CREATE TABLE modulart (
idmodulart int(10) unsigned NOT NULL auto_increment,
modulart varchar(40) default NULL,
PRIMARY KEY ( idmodulart )
) ENGINE=InnoDB;

Table „fachrichtung“ DDL

CREATE TABLE fachrichtung (
idfachrichtung int(10) unsigned NOT NULL auto_increment,
fachrichtung varchar(25) default NULL,
PRIMARY KEY ( idfachrichtung )
) ENGINE=InnoDB;

Table „unterrichtszeit“ DDL

CREATE TABLE unterrichtszeit (
idunterricht int(10) unsigned NOT NULL auto_increment,
unterrichtzeit varchar(20) default NULL,
bemerkungen varchar(50) default NULL,
PRIMARY KEY ( idunterricht )
) ENGINE=InnoDB;

Ich bin für jeden Hinweis sehr dankbar.
Carla

Hallo Carla!

Ich bin zwar eher bei Oracle zu Hause, aber das hier ist recht eindeutig:

Fehler: 1452 - Cannot add or update a child row: a foreign
key constraint fails (weiterbildung/modul, CONSTRAINT
modul_ibfk_1 FOREIGN KEY (idmodul) REFERENCES modulart
(idmodulart) ON DELETE CASCADE ON
UPDATE CASCADE)

Ich arbeite mit Mysql 5.0.15. Die Fehlermeldung erscheint,
wenn man bei der Kindtabelle eine Zeile mehr hinzufügen möchte
als bei der Vatertabelle vorhanden ist.

Der Fehler besagt eben, dass du das nicht darfst. Der Grund: Du definierst in Tabelle Modul, dass es bei der Anlage eines solchen den entsprechenden Satz in Modulart schon geben muss, und zwar hier:

CREATE TABLE modul (

[…]

CONSTRAINT modul_ibfk_1 FOREIGN KEY ( idmodul ) REFERENCES
modulart ( idmodulart ) ON DELETE CASCADE ON UPDATE CASCADE,

Der Sinn des ganzen: Man will sicher stellen, dass jedes Modul auch eine eindeutig definierte Modulart hat. Wenn aber die Modulart nicht definiert ist, dann verweist deine Spalte Modul/idmodul ins Nirvana. Du musst also zuerst den entsprechenden Eintrag in Modulart anlegen und erst danach den Eintrag in Modul machen.

Hoffe geholfen zu haben…

Gruß
Martin

Hallo Martin

Zuerst einmal vielen Dank für Deine Hilfe. Du hast mir den Horizont schon beträchtlich erweitert. Ich habe in diesem Falle anscheinend Grundlegendes noch nicht verstanden.

Ich habe gedacht die Fremdschlüssel sind dazu da, um Tabellen nach der Normalisierung wieder zusammenzufügen. In der Tabelle Modul möchte ich bspw. alle 50 „Unterrichtsfächer“ erfassen und in der Tabelle Modulart, lediglich die beiden Fachrichtungen. Bspw. Gerätetechniker und Systemtechniker. Und diese beiden Ausdrücke möchte ich dann zum jeweiligen Modul je nach dem hinzufügen können.

Kannst Du mir vielleich nochmals helfen? Einen schönen Tag
Carla

Hallo Carla,

Fremdschlüssel sind Einschränkungen (ein CONSTRAINT eben). Ein Fremdschlüssel VERHINDERT das Einfügen eines Wertes, der NICHT BEREITS in der referenzierten Tabelle vorkommt.

Beim Anlegen von Tabellen muss die referenzierte Tabelle VOR der referenzierenden (diese besitzt den Fremdschlüssel) erstellt werden.

Fremdschlüssel tun sonst nichts.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Peter

Besten Dank für diese Erläuterung! Jetzt ist natürlich alles klar. Ich habe gedacht, dass man nur über Fremdschlüssel Tabellen miteinander verbinden kann.

Vielen Dank nochmals und einen erholsamen Sonntag
Carla