47

我正在按照http://www.sqlite.org/foreignkeys.html上的 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
    );

第一张桌子做得很好。错误发生在第二个语句中。我已经尝试过将两个查询包装在一个事务中,也没有。这是错误:

外键定义(代码 1)中的未知列“checklist_id”:,编译时: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)

4

5 回答 5

94

checklist_id INTEGER在将其添加为外键之前,您仍然必须创建该列。

所以它会是:

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)
    );
于 2012-07-18T15:46:23.193 回答
6

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

所以你需要添加这个:

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

现在它应该可以工作了。

于 2012-07-18T15:55:12.293 回答
5

在使用 FOREIGN KEY() 包装之前,您需要包含列名。

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
    );
于 2012-07-18T15:49:03.537 回答
3

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

于 2014-08-05T13:14:26.947 回答
1

我认为上述答案并不完全正确,或者至少有点误导。正如他们正确指出的那样,您可以创建列,然后在单独的行上添加外键约束。这称为指定表约束。

但是还有一个更短的语法,当仅应用于 1 列时,所有 4 个可能的约束(PRIMARY KEYUNIQUECHECKFOREIGN KEY)也可以内联指定(NOT NULL例如 ),作为列约束。即你可以写:

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

顺便说一句,如果你不确定正确的语法,官方文档有非常漂亮的铁路图。

于 2018-11-06T13:43:42.280 回答