Pytanie Ograniczenie klucza obcego NA KASOWANIU CASCADE nie działa w bazie danych sqlite na Androidzie


Mam tabelę "dni" utworzoną w następujący sposób

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

i mam tabelę ścieżek utworzoną w następujący sposób

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

jak pokazano powyżej mam cudzysłów klucza day_id odniesienia do day_id dni tabeli ...

Więc jeśli chcę usunąć dzień, to powinien również zostać usunięty odpowiedni utwór ... Ale tak się nie dzieje w moim przypadku.

Mam sqlite z wersją 3.5.9

Dodałem też 1 linię w mojej klasie pomocnika jako

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

ale nadal nie będzie działać ... proszę, pomóż mi.


13
2018-05-23 11:58


pochodzenie


ale jak już powiedziałem, dodałem wiersz "PRAGMA foreign_keys = ON"; w mojej klasie pomocy sqlite - NullPointerException


Odpowiedzi:


Usuwanie kaskadowe nie jest obsługiwane do wersji Sqlite 3.6.19, która jest najpierw dołączona do systemu Android 2.2.

Na szczęście istnieje alternatywa.

Możesz wykonać inne zapytanie, takie jak to, poniżej kwerendy tabeli tworzenia:

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

Zauważ, że delete_days_with_track to tylko nazwa opisująca działanie wyzwalacza i jest to po prostu wzór, którego używam; Wierzę, że możesz nazwać to, co chcesz.


9
2018-05-23 12:15



To nie działa dla mnie. Muszę użyć (WHERE OLD.day_id = days.day_id), aby działało. Spędziłem dużo czasu, dopóki go nie wydałem. Po więcej informacji. sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers - Islam Hassan
Zabawny. Mam tu 3.7.9 na maszynie Ubuntu 12.04, a NA KASKU CASE DELETE też nie działa. O dziwo, spust nie działa: przetłumaczony na podany przykład, twierdzi "Błąd: brak takiej kolumny: track.day_id" - chociaż SELECT * FROM track JOIN days ON track.day_id=days.day_id działa w porządku. Jestem zmieszany. - Izzy


Według Dokumentacja SQLite obsługa kluczy obcych została dodana do 3.6.19.

Używając 3.5.9, będziesz musiał wykonać swoje usuwanie kaskadowo w inny sposób.


1
2018-05-23 12:13



Czy istnieje jakiś sposób, aby uaktualnić wersję sqlite lub w jakikolwiek inny sposób? ponieważ muszę obsługiwać moją aplikację na Androida w wersji 2.1 - NullPointerException
Nie musisz wykonywać ręcznych operacji usuwania, zapoznaj się z poniższym zapytaniem o wyzwalacz. - jkschneider
@jkschneider, Ah, dzięki! Używam SQLite, ale nie twierdzę, że jestem ekspertem. Dzięki za nauczenie mnie czegoś nowego. - Barak
@Rashmi, zobacz odpowiedź jkschneidera na rozwiązanie - Barak
@ Barak, chciałbym móc powiedzieć, że byłem ekspertem, ale skończyłem robić ręczne usuwanie przez kilka miesięcy, zanim natknąłem się na tę sztuczkę gdzieś ... Och, radość z konieczności oczyszczenia kodu. - jkschneider