2012-07-18 68 views
35

Postępuję zgodnie z instrukcjami z dokumentacji SQLite pod numerem http://www.sqlite.org/foreignkeys.html, ale próba dodania klucza obcego kończy się niepowodzeniem. Oto moje instrukcje tworzenia:Klucz obcy SQLite

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

Pierwszy stół jest w porządku. Błąd występuje w drugiej instrukcji. Próbowałem zarówno z zawijania dwóch kwerend w transakcji i bez. Tutaj jest błąd:

nieznany kolumna "checklist_id" w definicji klucza obcego (kod 1), podczas kompilacji: CREATE element tablicy (_id INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY (checklist_id) odniesienia kontrolną (_id) ITEM_TEXT TEKST , item_hint TEXT, item_order INTEGER, created_on INTEGER, modified_on INTEGER)

Odpowiedz

69

Musisz jeszcze utworzyć kolumnę, zanim dodasz ją jako klucz obcy.

Więc byłoby:

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     item_text TEXT, 
     item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 
    ); 
+0

Doh! Dziękuje za wszystko! :-) –

+8

Właściwie był jeden problem z tym ... ograniczenie musi nastąpić po zdefiniowaniu wszystkich pól. Tak więc obca linia klucza powinna być po modyfikowanej_on. (Na wypadek, gdyby ktoś patrzył na to w 2019 roku. Witaj z przeszłości!) –

+0

Naprawiłem to. @GeeksOnHugs, powinieneś być w stanie edytować odpowiedź na swoje pytania. Ktoś musi zatwierdzić edycję, ale w przyszłości, jeśli czyjaś odpowiedź zawiera błąd, możesz ją edytować dla tych osób w 2019 roku :) – Scen

4

Musisz zawierać nazwę kolumny przed owinąć go z kluczem obcym().

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 
5

prostu brakuje checklist_id kolumnę w poz tabeli. Musisz to zadeklarować, zanim chcesz ustawić go jako FOREIGN KEY. Próbowałeś utworzyć FK w nieistniejącej kolumnie i to jest powód, dla którego nie działa.

Więc trzeba dodać to:

checklist_id INTEGER, 
FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 

teraz powinien on działa.

3

Umieść definicję klucza OBCEGO na końcu instrukcji SQL