外键约束ON DELETE CASCADE在android上的sqlite数据库中不起作用

Nul*_*ion 13 sqlite android foreign-key-relationship

我有如下创建的"天"表

"create table days(" +
            "day_id  integer primary key autoincrement, " +
            "conference_id integer , " +
            "day_date text, " +
            "day_start_time text, " +
            "day_end_time text, " +
            "day_summary text, " +
            "day_description text)";
Run Code Online (Sandbox Code Playgroud)

我有如下创建的轨道表

CREATE_TABLE_TRACK = "create table track(" +
        "track_id integer primary key autoincrement," +
        "day_id integer,"+
        "track_name text," +
        "track_description text," +
        " FOREIGN KEY(day_id) REFERENCES days(day_id) ON DELETE CASCADE )";
Run Code Online (Sandbox Code Playgroud)

如上所示,我有外键day_id引用表天的day_id ...

所以我想要的是,如果我删除那一天,那么相应的轨道也应该被删除...但它不会发生在我的情况下..

我有版本3.5.9的 sqlite

而且我在我的帮助类中添加了一行作为

> db.execSQL("PRAGMA foreign_keys = ON;");

但仍然无法工作..请帮帮我..

jks*_*der 9

直到Sqlite版本3.6.19(第一次包含在Android 2.2中)才支持级联删除.

幸运的是还有另一种选择.

您可以在create table query下面执行如下所示的另一个查询:

db.execSQL("CREATE TRIGGER delete_days_with track BEFORE DELETE ON track "
       +  "FOR EACH ROW BEGIN"
       +         " DELETE FROM days WHERE track.day_id = days.day_id "
       +  "END;");
Run Code Online (Sandbox Code Playgroud)

请注意,这delete_days_with_track只是描述触发器操作的名称,这只是我使用的模式; 我相信你可以任意命名.

  • 这不适合我.我将使用(WHERE OLD.day_id = days.day_id)来使其正常工作.我花了很多时间才发布它.有关更多信息.http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers (4认同)