我一直在尝试在我的Android SQLite数据库中使用外键。我尝试了以下语法,但它给了我一个力量关闭:
private static final String TASK_TABLE_CREATE = "create table "
+ TASK_TABLE + " (" + TASK_ID
+ " integer primary key autoincrement, " + TASK_TITLE
+ " text not null, " + TASK_NOTES + " text not null, "
+ TASK_DATE_TIME + " text not null, FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+" ("+CAT_ID+"));";
任何想法我可能做错了什么?如果您需要查看其他表结构,那么我可以,它只是一个非常简单的结构,第二个带有ID和名称。
修改:
这是错误:
03-13 13:42:35.389: ERROR / AndroidRuntime(312):引起: android.database.sqlite.SQLiteException: 国外未知栏“taskCat” 键定义:创建表提醒 (_id整数主键 自动增量,task_title文本没有 null,注释文本不为null, reminder_date_time文本不为null, FOREIGN KEY(taskCat)参考 category(_id));
答案 0 :(得分:103)
您必须先定义TASK_CAT
列,然后在其上设置外键。
private static final String TASK_TABLE_CREATE = "create table "
+ TASK_TABLE + " ("
+ TASK_ID + " integer primary key autoincrement, "
+ TASK_TITLE + " text not null, "
+ TASK_NOTES + " text not null, "
+ TASK_DATE_TIME + " text not null,"
+ TASK_CAT + " integer,"
+ " FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+"("+CAT_ID+"));";
您可以在sqlite外键doc上找到更多信息。
答案 1 :(得分:9)
由于我无法发表评论,除了@jethro回答之外还添加了这个注释。
我发现你还需要将FOREIGN KEY行作为创建表语句的最后一部分,否则在安装应用程序时会出现语法错误。我的意思是,你不能做这样的事情:
private static final String TASK_TABLE_CREATE = "create table "
+ TASK_TABLE + " (" + TASK_ID
+ " integer primary key autoincrement, " + TASK_TITLE
+ " text not null, " + TASK_NOTES + " text not null, "
+ TASK_CAT + " integer,"
+ " FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+" ("+CAT_ID+"), "
+ TASK_DATE_TIME + " text not null);";
我将TASK_DATE_TIME放在外键行之后。
答案 2 :(得分:2)
正如您在错误描述中看到的那样,您的表包含列(_id,tast_title,notes,reminder_date_time),并且您尝试从“taskCat”列添加外键,但它在您的表中不存在!< / p>