Подтвердить что ты не робот

Ограничение внешнего ключа ON 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;" );

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

4b9b3361

Ответ 1

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

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

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

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 - это просто имя, описывающее действие триггера, и это только шаблон, который я использую; Я полагаю, вы могли бы назвать его чем угодно.

Ответ 2

В соответствии с SQLite Documentation поддержка внешних ключей не была добавлена ​​до 3.6.19.

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