【问题标题】:SQlite - Android - Foreign key syntaxSQlite - Android - 外键语法
【发布时间】:2011-07-14 11:24:59
【问题描述】:

我一直在尝试让外键在我的 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: 错误/AndroidRuntime(312):由以下原因引起: android.database.sqlite.SQLiteException: 国外未知列“taskCat” 关键定义:创建表提醒 (_id 整数主键 自动增量,task_title 文本不是 null,注释文本不为空, 提醒日期时间文本不为空, 外键(taskCat)参考 类别 (_id));

【问题讨论】:

    标签: android sqlite foreign-keys


    【解决方案1】:

    您必须先定义您的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 上找到更多信息。

    【讨论】:

    • 这个解决方案对我不起作用。我找到的解决方案是在一行中定义它,但语法略有不同。我这样做而不是最后两行:TASK_CAT+" INTEGER REFERENCES "+CAT_TABLE+");";
    • @HotN,你是对的伙伴。您的解决方案也对我有用。谢谢
    • @jetho 我想添加功能,一旦父键删除,所有子键的列记录也应该被删除。
    【解决方案2】:

    由于我无法发表评论,因此除了 @jethro 答案之外添加此注释。

    我发现您还需要将 FOREIGN KEY 行作为 create table 语句的最后一部分,否则在安装应用程序时会出现语法错误。我的意思是,你不能这样做:

    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 放在外键行之后。

    【讨论】:

      【解决方案3】:

      正如您在错误描述中看到的,您的表包含列(_id、tast_title、notes、reminder_date_time),您正尝试从“taskCat”列中添加一个外键,但它在您的表中不存在!

      【讨论】:

        猜你喜欢
        • 2013-06-05
        • 2012-12-25
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多