Fehler beim fremdschlüssel

vector_ever

Mitglied
Hello,

I möchte 2 Tabeln erzeugen einer ist mit PK und die andere mit FK (Mysql mit Java)

Code:
String createTable1 = "CREATE TABLE  eumonis.DistributionGridOperator " 
		          + "(operatorId VARCHAR(25)  PRIMARY KEY NOT NULL," +
		          		"name VARCHAR(75) NOT NULL)";

	 String createTable2 = "CREATE TABLE  eumonis.PowerPlant " 
		          + "(plantId VARCHAR(25) PRIMARY KEY NOT NULL," 
		            +"manufacturerId VARCHAR(25) NOT NULL," 
		            +"distOpId VARCHAR(25)  NOT NULL,"
		            + "TransOpId VARCHAR(25)  NOT NULL,"
		            + "LocationId VARCHAR(25)  NOT NULL,"
		            + "StateId VARCHAR(25) NOT NULL,"
		            + "LevelId VARCHAR(25) NOT NULL,"
		            + "SourceId VARCHAR(25) NOT NULL)" +
		            " FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId)";

Die Fehlermeldung bekomme ich bei Ausführung:
HTML:
SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId) E' at line 1

wie kann man den Fehler lösen?
 
In dem man richtiges SQL verwendet ;-)

Versuch mal

Java:
+ "SourceId VARCHAR(25) NOT NULL," +
                    " FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId) )";
 
Ok, sorry, ich habe ")" am Ende vergessen, aber trotzdem der gleiche fehler
HTML:
SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId))' at line 1
 
Ich habe genau so
Code:
+ "SourceId VARCHAR(25) NOT NULL," +
                    " FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId))";
und bekomme noch Fehlermeldung.
 
Sorry, aber dieser Query tuts bei mir in phpMyAdmin, ein paar Quotes drum herum, und dann sollte es auch mit Java Funktionieren:

Code:
CREATE TABLE  eumonis.PowerPlant (
  plantId VARCHAR(25) PRIMARY KEY NOT NULL,
  manufacturerId VARCHAR(25) NOT NULL,
  distOpId VARCHAR(25)  NOT NULL,
  TransOpId VARCHAR(25)  NOT NULL,
  LocationId VARCHAR(25)  NOT NULL,
  StateId VARCHAR(25) NOT NULL,
  LevelId VARCHAR(25) NOT NULL,
  SourceId VARCHAR(25) NOT NULL,
  FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId)
);

Ich würde es in Java dann so schreiben:

Java:
String query = "CREATE TABLE  eumonis.PowerPlant (" //
+ "  plantId VARCHAR(25) PRIMARY KEY NOT NULL," //
+ "  manufacturerId VARCHAR(25) NOT NULL," //
+ "  distOpId VARCHAR(25)  NOT NULL," //
+ "  TransOpId VARCHAR(25)  NOT NULL," //
+ "  LocationId VARCHAR(25)  NOT NULL," //
+ "  StateId VARCHAR(25) NOT NULL," //
+ "  LevelId VARCHAR(25) NOT NULL," //
+ "  SourceId VARCHAR(25) NOT NULL," //
+ "  FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId)" //
+ ")";
 
Danke, es funktioniert, aber was ich wirklich machen möchte, mehrere Fremdschlüsseln (jeder Fremdschlüssel referenziert zu PK in verschiedene Tabellen)

Code:
/* String createTable = "CREATE TABLE  eumonis.Manufacturer " 
		          + "(name VARCHAR(75) PRIMARY KEY NOT NULL)";*/
	   
	  /* String createTable = "CREATE TABLE  eumonis.DistributionGridOperator " 
		          + "(operatorId VARCHAR(25)  PRIMARY KEY NOT NULL," +
		          		"name VARCHAR(75) NOT NULL)";*/
	   
	   /*
	     String createTable = "CREATE TABLE  eumonis.TransmissionGridOperator " 
		          + "(operatorId VARCHAR(25)  PRIMARY KEY NOT NULL," +
		          		"name VARCHAR(75) NOT NULL)";
	    */

Code:
	 String createTable = "CREATE TABLE  eumonis.PowerPlant (" //
					+ "  plantId VARCHAR(25) PRIMARY KEY NOT NULL," //
					+ "  manufacturerId VARCHAR(25) NOT NULL," //
					+ "  distOpId VARCHAR(25) NOT NULL," //
					+ "  TransOpId VARCHAR(25)  NOT NULL," //
					+ "  LocationId VARCHAR(25)  NOT NULL," //
					+ "  StateId VARCHAR(25) NOT NULL," //
					+ "  LevelId VARCHAR(25) NOT NULL," //
					+ "  SourceId VARCHAR(25) NOT NULL," //
					+ "  FOREIGN KEY (manufacturerId) REFERENCES eumonis.Manufacturer(name)" //
					+ "  FOREIGN KEY (TransOpId) REFERENCES eumonis.TransmissionGridOperator(operatorId)" //
					+ "  FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId)" //
					+ ")";

Die Lösung mit einem FK funktioniert gut, aber mit mehrere von verschiedene Tabellen!!
 
Du musst die FKs auch mit Komma trennen. Warum probierst du das SQL nicht einfach in einem Client wie phpMyAdmin oder auch der MySQL Workbench aus und fügst es dann anschließend in einen Java-String ein?

Java:
String createTable = "CREATE TABLE  eumonis.PowerPlant (" //
                    + "  plantId VARCHAR(25) PRIMARY KEY NOT NULL," //
                    + "  manufacturerId VARCHAR(25) NOT NULL," //
                    + "  distOpId VARCHAR(25) NOT NULL," //
                    + "  TransOpId VARCHAR(25)  NOT NULL," //
                    + "  LocationId VARCHAR(25)  NOT NULL," //
                    + "  StateId VARCHAR(25) NOT NULL," //
                    + "  LevelId VARCHAR(25) NOT NULL," //
                    + "  SourceId VARCHAR(25) NOT NULL," //
                    + "  FOREIGN KEY (manufacturerId) REFERENCES eumonis.Manufacturer(name)," //
                    + "  FOREIGN KEY (TransOpId) REFERENCES eumonis.TransmissionGridOperator(operatorId)," //
                    + "  FOREIGN KEY (distOpId) REFERENCES eumonis.DistributionGridOperator(operatorId)" //
                    + ")";

Ist doch kein Hexenwerk ;-)
 
Naja, du lädst dir ein Programm wie MySQL Workbench, SQLyog oder dergleichen herunter und installierst es. Dann startest du es, richtest die Verbindung zur Datenbank ein und schreibst SQL/führst es aus. Wenn das SQL deinen Wünschen entspricht bzw das macht, was du willst, kopierst du es aus dem Programm in den Source-Code deiner Java-Klasse, formatierst es so, dass du es gut lesen kannst und machst die Gänsefüsschen (Double-Quotes) dort, wo sie hinkommen. Das hat auch nix primär mit Foreign Keys zu tun, das sollte man immer so machen, einfach um das SQL auch vor der Programm-Ausführung testen zu können.

Ich habe aber derzeit eher das Gefühl, dir mangelt es an Wissen bez. SQL-Syntax ;-) Dafür habe ich kein wirkliches Tutorial, nur die Doku und Little Idiot (kein Witz oder boshaft gemeint - ist ne wirklich gute Seite).
 

Neue Beiträge

Zurück