2012-07-18 84 views
35

我在下面从http://www.sqlite.org/foreignkeys.html SQLite的文档的说明但是我尝试添加一个外键失败。这里是我的创建陈述:SQLite的外键

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

第一张桌子被罚款。第二条语句发生错误。我已经尝试将两个查询包装在一个事务中而没有。这里是错误:

外键定义中的未知列“checklist_id”(代码1):,编译时:CREATE TABLE item(_id INTEGER PRIMARY KEY AUTOINCREMENT,FOREIGN KEY(checklist_id)REFERENCES checklist(_id),item_text TEXT ,item_hint TEXT,item_order INTEGER,created_on INTEGER,modified_on整数)

回答

69

你还有你将它添加为外键之前创建的列。

因此,这将是:

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     item_text TEXT, 
     item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 
    ); 
+0

Doh!谢谢大家! :-) – 2012-07-18 15:59:04

+8

实际上,这有一个问题...约束必须在所有字段被定义之后出现。所以外键行应该在modified_on之后。 (如果有人在2019年寻求帮助。你好,从过去!) – 2012-07-18 17:19:33

+0

我解决了这个问题。 @GeeksOnHugs,你应该能够编辑你的问题的答案。有人必须批准编辑,但如果某人的回答出现错误,您可以在2019年为那些人编辑它:) – Scen 2012-07-18 17:26:42

4

您需要包括列名与外国密钥包装之前,()。

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 
5

只要你在你的项目表中缺少checklist_id列。您需要先声明它,然后才能将其设置为FOREIGN KEY。您试图在不存在的列上创建FK,这就是为什么它不起作用的原因。

所以,你需要补充一点:

checklist_id INTEGER, 
FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 

现在它应该工作。

3

将FOREIGN KEY定义放在SQL语句的末尾