2015-05-08 57 views
1

我正在嘗試創建下列表格設計,但我在下面得到了這個錯誤,我該如何在arrivaltimes表格中設置stops表的外鍵?創建外鍵的語法錯誤

1064 - 您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的手冊正確的語法使用近 'FOREIGN KEY參考站(stop_id))' 第4行

stt.execute("CREATE TABLE IF NOT EXISTS stops" 
     + "(stop_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, " 
     + " name varchar(30) NOT NULL, " + " route INT(11) NOT NULL, " 
     + " lat double(10,6) NOT NULL, " 
     + " longi double(10,6)NOT NULL) "); 

stt.execute("CREATE TABLE IF NOT EXISTS arrivaltimes(id INT(11) NOT NULL PRIMARY KEY," 
     + " weekday VARCHAR(20) NOT NULL," 
     + "arrivaltime time NOT NULL," 
     + " stop_id INT FOREIGN KEY REFERENCES stops(stop_id))"); 

回答

1

變化

stop_id INT FOREIGN KEY REFERENCES stops(stop_id) 

stop_id INT, FOREIGN KEY fk_stop_id(stop_id) REFERENCES stops(stop_id) 
+0

感謝它的作品,但是'fk_stop_id'是什麼? – MrPencil

+0

@MrPencil:它看起來像一個約束名稱,我不知道這是必要的,但確實是必要的。如果你忽略掉fk_stop_id會發生什麼? –

+1

如果您沒有指定名稱,MySQL將生成一個名稱。如果您希望刪除外鍵(例如在模式回滾腳本中),則需要指定名稱。因此,自己分配一個好主意。 – Asaph

0

我已經更新了查詢,請注意FOREIGN KEY的語法,你在哪裏有一個錯誤。乾杯!

stt.execute("CREATE TABLE IF NOT EXISTS stops" 
     + "(stop_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, " 
     + " name varchar(30) NOT NULL, " + " route INT(11) NOT NULL, " 
     + " lat double(10,6) NOT NULL, " 
     + " longi double(10,6)NOT NULL) "); 



stt.execute("CREATE TABLE IF NOT EXISTS arrivaltimes(id INT(11) NOT NULL PRIMARY KEY," 
          + " weekday VARCHAR(20) NOT NULL," 
          + "arrivaltime time NOT NULL," 
          + " FOREIGN KEY (stop_id) REFERENCES stops(stop_id))"); 
0

如果你看一下MySQL CREATE TABLE syntax,那麼你的選擇:

內聯函數(注意沒有FOREIGN KEY

stop_id INT REFERENCES stops(stop_id) 

和明確的定義:

stop_id INT, 
FOREIGN KEY (stop_id) REFERENCES stops(stop_id) 

或更高版本(帶命名限制):

stop_id INT, 
CONSTRAINT fk_arrivaltimes_stops FOREIGN KEY (stop_id) REFERENCES stops(stop_id)