2016-11-15 94 views
2

我承認這已在這裏多次提出,並且我已經瀏覽了很多答案。對於CREATE TABLE MySQL Errno 150(不正確的外鍵)

我知道errno150指的是一個帶有不正確外鍵的表,並且我見過以前的答案here。我已經檢查了所有的情況,但無法弄清楚。不知道我是否錯過了一些明顯的東西。

這是使用MySQL的java的implentation,我已經創建兩個表(目前)switch語句,像這樣:

//Creates the table with the name given to the function and adds all fields & keys 
      switch(tableName){ 
      case "Address": 
       stmt.executeUpdate("CREATE TABLE Address(houseNo INT(4) NOT NULL, " 
         + "firstLine VARCHAR(30) NOT NULL, " 
         + "secondLine VARCHAR(30), " 
         + "city VARCHAR(25) NOT NULL, " 
         + "county VARCHAR(25) NOT NULL, " 
         + "postCode VARCHAR(7) NOT NULL, " 
         + "PRIMARY KEY (houseNo, postCode))"); 
       break; 
      case "Patient": 
       stmt.executeUpdate("CREATE TABLE Patient(patientID INT(8) NOT NULL PRIMARY KEY AUTO_INCREMENT, " 
         + "title VARCHAR (10) NOT NULL, " 
         + "forename VARCHAR(15) NOT NULL, " 
         + "surname VARCHAR(25) NOT NULL, " 
         + "dob DATE NOT NULL, " 
         + "phoneNo CHAR(11) NOT NULL, " 
         + "houseNo INT(4) NOT NULL, " 
         + "postCode VARCHAR(7) NOT NULL, " 
         + "amountOwed DECIMAL(5,2) NOT NULL, " 
         + "FOREIGN KEY (houseNo) REFERENCES Address (houseNo), " 
         + "FOREIGN KEY (postCode) REFERENCES Address (postCode))"); 
       break; 
      } 

地址創建優良(無外鍵),患者給予errno150 。相同的引擎,相同的字符集,相同的數據類型(甚至可以複製粘貼以100%確定),新創建(空)表,這兩個表都是非臨時的。

謝謝。

P.S.我無法使用SHOW ENGINE INNODB STATUS,因爲我沒有足夠高的權限級別。

完整的錯誤消息:

java.sql.SQLException: Can't create table 'team.Patient' (errno: 150) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545) 
    at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1540) 
    at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2595) 
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1468) 
    at uk.team.App.makeTable(App.java:146) 
    at uk.team.App.setupEnviro(App.java:80) 
    at uk.team.App.access$1(App.java:45) 
    at uk.team.App$1.run(App.java:33) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+1

可以粘貼整個錯誤?你在mysql命令行上得到了什麼? – Jordon

+1

@ShivaShinde它是通過Java創建的,我可以在原始文章中添加完整的錯誤。 –

+1

請添加整個錯誤! – Jordon

回答

2

如果你想創建一個在相同行你需要指定兩列一個外鍵(而不是針對每兩個獨立的FK約束父表的匹配列的外鍵約束柱)。

這對我的作品與MySQL 5.6.13:

stmt.executeUpdate("CREATE TABLE Address(houseNo INT(4) NOT NULL, " 
     + "firstLine VARCHAR(30) NOT NULL, " 
     + "secondLine VARCHAR(30), " 
     + "city VARCHAR(25) NOT NULL, " 
     + "county VARCHAR(25) NOT NULL, " 
     + "postCode VARCHAR(7) NOT NULL, " 
     + "PRIMARY KEY (houseNo, postCode))"); 
stmt.executeUpdate("CREATE TABLE Patient(patientID INT(8) NOT NULL PRIMARY KEY AUTO_INCREMENT, " 
     + "title VARCHAR (10) NOT NULL, " 
     + "forename VARCHAR(15) NOT NULL, " 
     + "surname VARCHAR(25) NOT NULL, " 
     + "dob DATE NOT NULL, " 
     + "phoneNo CHAR(11) NOT NULL, " 
     + "houseNo INT(4) NOT NULL, " 
     + "postCode VARCHAR(7) NOT NULL, " 
     + "amountOwed DECIMAL(5,2) NOT NULL, " 
     + "FOREIGN KEY (houseNo, postCode) REFERENCES Address (houseNo, postCode))"); 
1

由於地址表沒有問題,這更是與患者表的引用和我假設隊是數據庫名稱:

  1. 從我在這裏看到的,引用的列應該被索引。你已經創建了一個索引(houseNo,postCode)在一起,爲什麼不嘗試爲他們分別創建索引,看看它是否適合你?

  2. 雖然你已經提到你使用了相同的引擎,字符集等,爲什麼不在上面的查詢中明確提及它們並運行它們。您可以在查詢中添加ENGINE = InnoDB嗎?

請讓我知道如果它不適合你。

Can't create table (errno: 150) InnoDB adding foreign key constraints

+0

感謝您的幫助。在嘗試了您的建議後(不幸的是,這兩種方法都無效)。我決定通過在地址表中添加一個自動生成的ID作爲Patient的一個主鍵和外鍵來讓步。我會把它作爲答案發布(儘管我很清楚這不是真的)。再次感謝。 –

0

所以答案(更多的妥協)我來:

switch(tableName){ 
      case "Address": 
       stmt.executeUpdate("CREATE TABLE Address(houseID INT(8) NOT NULL PRIMARY KEY AUTO_INCREMENT, " 
         + "houseNo INT(4) NOT NULL, " 
         + "firstLine VARCHAR(30) NOT NULL, " 
         + "secondLine VARCHAR(30), " 
         + "city VARCHAR(25) NOT NULL, " 
         + "county VARCHAR(25) NOT NULL, " 
         + "postCode VARCHAR(7) NOT NULL)"); 
       break; 
      case "Patient": 
       stmt.executeUpdate("CREATE TABLE Patient(patientID INT(8) NOT NULL PRIMARY KEY AUTO_INCREMENT, " 
         + "title VARCHAR (10) NOT NULL, " 
         + "forename VARCHAR(15) NOT NULL, " 
         + "surname VARCHAR(25) NOT NULL, " 
         + "dob DATE NOT NULL, " 
         + "phoneNo CHAR(11) NOT NULL, " 
         + "houseID INT(8) NOT NULL, " 
         + "amountOwed DECIMAL(5,2) NOT NULL, " 
         + "FOREIGN KEY (houseID) REFERENCES Address (houseID))"); 
       break; 
} 

與一個ID是主鍵,唯一引用外鍵「地址」創建一個額外的場在'患者'中。這不是理想的,但它是功能性的。

相關問題