我下面从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整数)
你还必须创建列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)
);
只要你缺少checklist_id
在您的项目表列。 你需要你想将其设置为之前声明它FOREIGN KEY
。 您试图创建FK
上不存在的列,这就是为什么它不工作。
所以,你需要补充一点:
checklist_id INTEGER,
FOREIGN KEY(checklist_id) REFERENCES checklist(_id)
现在它应该工作。
您需要包括列名与外国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
);
我认为以上的回答是不完全正确,或者至少有些误导。 当他们正确地指出的那样,你可以创建列,然后在一个独立的行添加一个外键约束。 这就是所谓的指定表约束。
但也有一个较短的语法中, 当仅施加于1列 ,所有4个可能的约束( PRIMARY KEY
, UNIQUE
, CHECK
, FOREIGN 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
);
顺便说一句,如果你拿不准正确的语法,在官方文档具有非常好的铁路图。