2015-05-08 56 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)