2013-08-22 18 views
26

我使用外键引用创建表。我想知道所需的语法。主要是我见过以下(从http://www.sqlite.org/foreignkeys.html#fk_basics):使用外键创建表的SQLite语法

CREATE TABLE artist( 
    artistid INTEGER PRIMARY KEY, 
    artistname TEXT 
); 
CREATE TABLE track( 
    trackid  INTEGER, 
    trackname TEXT, 
    trackartist INTEGER, 
    FOREIGN KEY(trackartist) REFERENCES artist(artistid) 
); 

然而,来自同一站点(http://www.sqlite.org/foreignkeys.html#fk_actions)我看到这一点:

CREATE TABLE artist( 
    artistid INTEGER PRIMARY KEY, 
    artistname TEXT 
); 
CREATE TABLE track( 
    trackid  INTEGER, 
    trackname TEXT, 
    trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE 
); 

后者语法是有点更简洁,但我想知道结果是否有所不同(除了ON UPDATE CASCADE,这当然有效;我只是将它包括在内,因为我完全从引用的网站复制了代码,并且因为我不知道上述语法没有这样做)只有在制定这样的规范时才适用)。我正在使用Android,以防万一。

回答

18

查看syntax diagrams

第一种语法是表约束,而第二种语法是列约束。 在这些示例中,它们的行为相同。

您需要一个表的多个列上的键(其中没有可以附加的单个列)的表约束。

18

这个答案可能与你的不相关,但我认为它应该对其他使用android数据库的人有帮助。
IN SQLite默认情况下禁用外键约束(为了向后兼容)。您必须明确使用它才能使用

PRAGMA foreign_keys = 1 

建立与数据库的连接后。 下面是官方文档的链接,更深入地解释它。 http://sqlite.org/foreignkeys.html 请导航到在上面的链接启用外键支持。

+0

嗨War_Hero,我得到的外键为nulls.Can你请看看它。这些是我的2个表格表1 - 最终字符串DATABASE_CREATE_TABLE =“创建表,如果不存在scannerValuess(id整数,partName文本null,成本文本null,外键(id)引用scannerUserValuess(userid))“;表2 - 最终字符串DATABASE_CREATE_TABLE_USER =“如果不存在,创建表scannerUserValuess(userid整数主键自动增量,名称文本非空,移动文本非空,地址文本非空,日期文本非空)”;请尽快帮我。提前感谢。 – Naveen