MYSQL: Cannot add or update a child row: a foreign key constraint fails

basmati123

Grünschnabel
Hallo!

Ich brauche dringend Hilfe!

Ich versuche gerade mehrere Tabellen zu verknüpfen und sie zu füllen.

Die Tabellen sehen so aus:

cd(kuenstlername, cdtitel, erscheinungsjahr, genre art)
kuenstler(kuenstlern, personenanzahl, gruendungsjahr, cdanzahl)
songs(cdt, songname, songlaenge)

primary keys:
cd: cdtitel // in der Annahme, das dieser eindeutig ist, hatte davor noch kuenstlername, war aber so einfacher
kuenstler: kuenstlern
songs: cdt, songname

foreign keys:
kuenstler: keiner // davor: kuenstlern mit bezug auf cd(kuenstlername)
songs: cdt mit bezug auf cd(cdtitel)

erstmal die Frage:
Sind die Foreign Keys (oder auch Primary Keys) so sinnvoll gewählt?

dann:
das Erzeugen der Tabellen sieht folgendermaßen aus: (klappt auch)

Code:
s.executeUpdate("create table cd (cdtitel char(11), kuenstlername char(11), ejahr int(4), genre char(10), art char(10), primary key(cdtitel)) engine=innodb;");
s.executeUpdate("CREATE INDEX cdtitel USING BTREE ON cd (cdtitel);");

s.executeUpdate("create table kuenstler(kuenstlern char(11), panzahl int(3), gjahr int(4), cdanzahl int (4), primary key(kuenstlern)) engine=innodb;");

s.executeUpdate("create table songs(cdt char(11), songname char(11), songlaenge decimal(4,2),  primary key(cdt,songname), constraint foreign key(cdt) references cd(cdtitel) on update restrict on delete cascade) engine=innodb;");

das Problem taucht auf, wenn ich die Tabellen jetzt füllen will:

Code:
// DAS KLAPPT:
s.executeUpdate("load data LOCAL infile '/home/htdocs/WEB-INF/cd.txt' into table cd fields terminated by ';';");

// DAS KLAPPT, seitdem kuenstlern nicht mehr foreign key ist, hatte davor die selbe Fehlermeldung, die jetzt nur unten auftaucht

s.executeUpdate("load data LOCAL infile '/home/htdocs/WEB-INF/kuenstler.txt' into table kuenstler fields terminated by ';';");

// DAS KLAPPT NICHT
s.executeUpdate("load data LOCAL infile '/home/htdocs/WEB-INF/songs.txt' into table songs fields terminated by ';';");

Dabei sind die CDtitel vorher schon in CD eingefügt worden!!

Die Fehlermeldung, die auftaucht:

Code:
Cannot add or update a child row: a foreign key constraint fails (`songs`, CONSTRAINT `songs_ibfk_1` FOREIGN KEY (`cdt`) REFERENCES `cd` (`cdtitel`) ON DELETE CASCADE)

Ich brauche dringend Hilfe! Wäre toll, wenn mir jemand helfen könnte!

Mfg
 
Ich würd jeder Tabelle noch 'ne Spalte ID hinzufügen, weil es macht ja keinen Sinn, den Titel bloß aufgrund der Refernzierung redundant abzuspeichern und so durch das Char feld unnötig viel Speicher zu belegen. Wenn du mal 'nen Titel korregieren willst, wirds kompliziert. Wenn du die Foreign keys dann über die ID refernzierst, sollte das keine Probleme geben und du kannst auch problemlos Titel und Künstlername updaten.
Da muss ja so wie du das jetzt angelegt hast nur irgendwo ein Space zuviel sein in einer zu importierenden Textdatei, und du kriegst die Daten da nicht in die Tabellen.
 
Hallo,

erstmal danke für die Antwort.

- zu jeder Tabelle eine Spalte ID
zu wirklich jeder Tabelle? Und die Spalte ID soll dann auch Primary Key sein?
also, eine Spalte ID in cd, songs und kuenstler, und foreign key von kuenstler und songs sind id mit verweis auf id in cd ich glaube, ich versteh das noch nicht ganz

also nicht in der form:
s.executeUpdate("CREATE INDEX cdtitel USING BTREE ON cd (cdtitel);");

sondern einfach eine zusätzliche spalte id in allen tabellen?
und was sind die foreign keys? sorry, kannst du das vielleicht nochmal genauer schreiben, bin anfänger!

vielen dank
 
Würde dir auch mal empfehlen etwas über "Normalisierung" zu googlen ;)
Sollte dir eigentlich bei der Erstellung/Wartung der Datenbank helfen.
 
Zurück