SQLite的外键(SQLite Foreign Key)

2019-06-26 08:51发布

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

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项目(_id INTEGER PRIMARY KEY AUTOINCREMENT,外键(checklist_id)参考清单(_id),ITEM_TEXT TEXT,item_hint TEXT,item_order INTEGER,created_on INTEGER ,modified_on整数)

Answer 1:

你还必须创建列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)
    );


Answer 2:

只要你缺少checklist_id在您的项目表列。 你需要你想将其设置为之前声明它FOREIGN KEY 。 您试图创建FK上不存在的列,这就是为什么它不工作。

所以,你需要补充一点:

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

现在它应该工作。



Answer 3:

您需要包括列名与外国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
    );


Answer 4:

把外键定义的SQL语句的结束



Answer 5:

我认为以上的回答是不完全正确,或者至少有些误导。 当他们正确地指出的那样,你可以创建列,然后在一个独立的行添加一个外键约束。 这就是所谓的指定表约束。

但也有一个较短的语法中, 当仅施加于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
);

顺便说一句,如果你拿不准正确的语法,在官方文档具有非常好的铁路图。



文章来源: SQLite Foreign Key