ограничение внешнего ключа на delete CASCADE не работает в базе данных sqlite на android

у меня есть таблица "дней", созданная следующим образом

"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)";

и у меня есть таблица треки, созданные следующим образом

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 )";

как показано выше, у меня есть внешний ключ day_id, ссылающийся на day_id табличных дней...

Так что я хочу, если я удалю день, то соответствующий трек также должен быть удален... Но в моем случае этого не происходит..

у меня есть sqlite с версией 3.5.9

а также я добавил 1 строку в моем помощнике класс

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

но все равно не будет работать.. пожалуйста, помоги мне..

2 ответов


каскадное удаление не поддерживается до версии Sqlite 3.6.19, которая впервые включена в Android 2.2.

к счастью, есть альтернатива.

вы можете выполнить другой запрос, как это ниже вашего запроса create table:

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;");

отметим, что delete_days_with_track - это просто имя, описывающее, что делает триггер, и это просто шаблон, который я использую; я считаю, что вы можете назвать его как угодно.


по словам Документация SQLite поддержка внешних ключей не была добавлена до 3.6.19.

используя 3.5.9, вам придется делать каскадные удаления каким-то другим способом.