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.
Tabela foobar prawdopodobnie również wymaga ograniczenia klucza podstawowego na (foo_id, bar_id). Ale to inna sprawa. –
@Catcall: Możesz skomentować mój wpis. – wes
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)'. –