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