2014-09-30 70 views
0

我想在sqlite3中创建一堆表,并且出现一个我无法修复的错误。对于用于外键的sqlite3的语法有些问题,但无法弄清楚。尝试创建外键的SQLite3语法错误

CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT, 
first_name VARCHAR(64), 
last_name VARCHAR(64) 
); 


CREATE TABLE classes (
id INTEGER PRIMARY KEY AUTOINCREMENT, 
class_name VARCHAR(64) 
); 



CREATE TABLE students_classes (
id INTEGER PRIMARY KEY AUTOINCREMENT, 
students_id INTEGER, 
classes_id INTEGER, 
FOREIGN KEY (students_id) REFERENCES students(id), 
FOREIGN KEY (classes_id) REFERENCES classes(id) 
); 



CREATE TABLE teachers (
id INTEGER PRIMARY KEY AUTOINCREMENT, 
classes_id INTEGER, 
first_name VARCHAR(64), 
last_name VARCHAR(64), 
FOREIGN KEY classes_id REFERENCES classes(id) 
); 


CREATE TABLE grades (
id INTEGER PRIMARY KEY AUTOINCREMENT, 
students_id INTEGER, 
grade_num INTEGER, 
FOREIGN KEY students_id REFERENCES students(id) 
); 


Error: near "students_id": syntax error 
+1

'FOREIGN KEY(students_id)' - 用'('和')'尝试。 – 2014-09-30 16:27:27

+0

它在sqlite3上 – xeroshogun 2014-09-30 16:33:17

+0

@ PM77-1有答案。也许他们应该像这样添加它。 – paqogomez 2014-09-30 16:39:39

回答

0

SQLite Docs似乎表明FOREIGN Key约束列姓名(或名称)必须在括号内:

table constrint diagram

我不知道它是如何严格执行实际。我的SQL Fiddle显示使用括号可以解决您的问题。

请注意,SQL FiddleSQLite仿真,所以你的结果仍可能会有所不同。

+0

为什么你不确定它的执行有多严格?这整个问题都是关于严格执法的。而sqlite.js是一个直接的C到JavaScript的翻译。 – 2014-09-30 17:26:06

+0

@CL - 我在'WebSQL'上运行它。我的观点是 - 使用适当的语法永远不会受到伤害,尽管*有时*你*可能会少一些。 – 2014-09-30 17:29:08

+0

WebSQL在浏览器中使用本地SQLite库。 – 2014-09-30 17:32:28