2011-08-04 24 views
16

Próbuję skonfigurować bazę danych SQLite3 z foo s i bar s oraz relację wiele do wielu. To, co mam do tej pory:SQLite wiele do wielu relacji?

CREATE TABLE foo(
    id INTEGER PRIMARY KEY NOT NULL, 
    foo_col INTEGER NOT NULL 
); 
CREATE TABLE bar(
    id INTEGER PRIMARY KEY NOT NULL, 
    bar_col TEXT NOT NULL 
); 
CREATE TABLE foobar(
    foo_id INTEGER, 
    bar_id INTEGER, 
    FOREIGN KEY(foo_id) REFERENCES foo(id) ON DELETE CASCADE, 
    FOREIGN KEY(bar_id) REFERENCES bar(id) ON DELETE CASCADE 
); 
CREATE INDEX fooindex ON foobar(foo_id); 
CREATE INDEX tagindex ON foobar(tag_id); 

... ale nie wydaje się działać. Mogę usunąć wiersz z foo i nie ma on wpływu na foobar. Co ja robię źle?

Odpowiedz

13

Zaczerpnięte z tej strony, http://www.sqlite.org/foreignkeys.html.

Zakładając, że biblioteka jest kompilowana z włączonymi ograniczeniami klucza obcego, musi być nadal włączona przez aplikację w czasie wykonywania, za pomocą komendy PRAGMA foreign_keys. Na przykład:

sqlite> PRAGMA foreign_keys = ON; 

Ograniczenia klucza obcego są domyślnie wyłączone (w celu zapewnienia kompatybilności wstecznej), dlatego należy je włączyć oddzielnie dla każdego połączenia z bazą danych oddzielnie. (Należy jednak pamiętać, że przyszłe wydania SQLite mogą ulec zmianie, tak aby domyślnie włączone były ograniczenia klucza obcego. Ostrożni programiści nie będą przyjmować żadnych założeń dotyczących tego, czy klucze obce są domyślnie włączone, ale w razie potrzeby będą je włączać lub wyłączać). Aplikacja może również użyć instrukcji PRAGA_HOWER_keys do ustalenia, czy klucze obce są aktualnie włączone. Poniższy sesji wiersza poleceń pokazuje to:

sqlite> PRAGMA foreign_keys; 
0 
sqlite> PRAGMA foreign_keys = ON; 
sqlite> PRAGMA foreign_keys; 
1 
sqlite> PRAGMA foreign_keys = OFF; 
sqlite> PRAGMA foreign_keys; 
0 

Wskazówka: Jeśli komenda „foreign_keys Pragma” zwraca żadnych danych zamiast pojedynczego wiersza zawierającego „0” lub „1”, a następnie wersja SQLite używasz nie obsługuje kluczy obcych (ponieważ jest starszy niż 3.6.19 lub został skompilowany za pomocą SQLITE_OMIT_FOREIGN_KEY lub zdefiniowanego SQLITE_OMIT_TRIGGER).

Nie można włączyć lub wyłączyć ograniczeń klucza obcego w trakcie transakcji wielostaniowej (gdy SQLite nie jest w trybie automatycznego zatwierdzania). Próba wykonania tego nie zwróci błędu; po prostu nie ma żadnego efektu.

+0

Tabela foobar prawdopodobnie również wymaga ograniczenia klucza podstawowego na (foo_id, bar_id). Ale to inna sprawa. –

+0

@Catcall: Możesz skomentować mój wpis. – wes

+0

Odpowiedź Ace, która pochodzi bezpośrednio z dokumentacji SQLite, jest dokładna i kompletna. Ale tak jak powiedziałem, tabela foobar również potrzebuje 'PRIMARY KEY (foo_id, bar_id)'. –

Powiązane problemy