mysql - tabellen erstellen - fehler

basmati123

Grünschnabel
Hallo,

ich versuche gerade mit mysql drei tabellen zu erstellen, die ich untereinander mit foreign keys verknüpfe.

Das ganze findet in einer java-datei statt.
Dies tut wohl nichts zur Sache, da ich es auch schon über phpmyadmin versucht habe, aber auch da die tabellen nicht generiert bekomme.

tabellen sehen so aus:
cd(kuenstlername, cdtitel, erscheinungsjahr, genre art)
kuenstler(kuenstlername, personenanzahl, gruendungsjahr, cdanzahl)
songs(cdtitel, songname, songlaenge)

primary keys:
cd: kuenstlername, cdtitel
kuenstler: kuenstlername
songs: cdtitel, songname

foreign keys:
kuenstler: kuenstlername mit bezug auf cd(kuenstlername)
songs: cdtitel mit bezug auf cd(cdtitel)

wenn ich das ganze über einen ftp-server laufen lasse mit meiner java datei, dann erkennt er gerade mal, dass die tabelle cd noch nicht da ist und erzeugt aber daraufhin keine neue, zu den weiteren kommt er nicht mal

unter phpmyadmin kann ich cd und kuenstler erzeugen, songs aber dann nicht mehr
fehlermeldung:
#1005 - Can't create table './songs.frm' (errno: 150)

wo liegt der fehler!?


hier der code:

Code:
// CD ERZEUGEN UND FUELLEN
		try {
			s.executeUpdate("drop table cd;"); 
		}
		catch (Exception e) {
			out.println("Tabelle 'cd' nicht da: kein DROP");
		}
		

s.executeUpdate("create table cd(kuenstlername char(11), cdtitel char(11), erscheinungsjahr int(4), genre char(10), art char(10), primary key(kuenstlername,cdtitel)) type=innodb;");

		// KUENSTLER ERZEUGEN UND FUELLEN

		try {
			s.executeUpdate("drop table kuenstler;"); 
		}
		catch (Exception e) {
			out.println("Tabelle 'kuenstler' nicht da: kein DROP");
		}

		s.executeUpdate("create table kuenstler(kuenstlername char(11), personenanzahl int(3), gruendungsjahr int(4), cdanzahl int (4), primary key(kuenstlername), constraint foreign key(kuenstlername) references cd(kuenstlername) on update restrict on delete cascade) type=innodb;");

		// SONGS ERZEUGEN UND FUELLEN

		try {
			s.executeUpdate("drop table songs;"); 
		}
		catch (Exception e) {
			out.println("Tabelle 'songs' nicht da: kein DROP");
		}

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

vielen dank!
 
Zuletzt bearbeitet:
Hallo,
das Problem konnte ich lösen, indem ich den PK aus cd Indizes gegeben habe.

Allerdings habe ich jetzt ein anderes Problem: ich kann für die Tabellen songs und kuenstler keine Werte einfügen.
Ich weiss, dass ich allg. keine Werte einfügen darf, wenn für den PK noch kein entsprechender Wert in cd existiert.
Dies tut es aber.

Code:
// Zunächst werden die Tabellen gedroppt - das funktioniert einwandfrei, deshalb hier nicht nochmal als Code (der Übersichtlichkeit halber)

// das Erzeugen der Tabellen ist jeweils mit try/catch umgeben, lasse ich hier auch weg - wegen der Übersichtlichkeit

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

// 2. SONGS ERZEUGEN

             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;");

// 3. KUENSTLER ERZEUGEN 

	    s.executeUpdate("create table kuenstler(kuenstlern char(11), panzahl int(3), gjahr int(4), cdanzahl int (4), primary key(kuenstlern), constraint foreign key(kuenstlern) references cd(kuenstlername) on update restrict on delete cascade) engine=innodb;");


// 4. TABELLEN FUELLEN
	
	  s.executeUpdate("load data LOCAL infile '/home/htdocs/WEB-INF/cd.txt' into table cd fields terminated by ';';");
	// cd fuellen klappt! - jetzt sind Werte mit "Pink Floyd" und "Sinatra" schon vorhanden
		
	try {

		s.executeUpdate("insert into kuenstler values('Pink Floyd', 5 , 1970 , 20);");
		s.executeUpdate("insert into kuenstler values('Sinatra', 1 , 1936 , 5);");

	}
	catch (Exception e10) {
			out.println("Fehler beim Fuellen aufgetreten<br> " + e10.getMessage());
	}

// Fuellen fuer Kuenstler oder Songs (egal welche) klappt nicht mehr: Sinatra und Pink Floyd sind als Kuenstlernamen jedoch schon in CD vertreten

Fehlermeldung:

Code:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`kuenstler`, CONSTRAINT `kuenstler_ibfk_1` FOREIGN KEY (`kuenstlern`) REFERENCES `cd` (`kuenstlername`) ON DELETE CASCADE)

Ich benutze die version 5.0.x

für Hilfe wäre ich sehr dankbar.

mfg
 
Zurück