SQLite3 „zapomina” o użyciu kluczy obcych
Używam Rubiego z SQLite3, a moje próby użycia kluczy obcych w Sqlite3 niestety nie powiodły się. Wedługsqlite3 --version
, wersja 3.7.13 jest zainstalowana. O ile wiem, Sqlite3 obsługuje klucze obce od wersji 3.6.x.
Wiem, że klucze obce są domyślnie wyłączone i muszą być aktywowane za pomocąPRAGMA foreign_keys = ON;
. W moim skrypcie do tworzenia baz danych Ruby robię coś takiego:
sql = <<-SQL
PRAGMA foreign_keys = ON;
CREATE TABLE apps (
id ....
);
CREATE TABLE requests (
...
app_id INTEGER NOT NULL,
FOREIGN KEY(app_id) REFERENCES apps(id),
);
...
SQL
db.execute_batch(sql)
Niestety, mogę z radością wstawiać wierszerequests
z nieznanymi identyfikatorami aplikacji działa, ale oczywiście nie powinien.
Interesujące: używając powłoki sqlite3 bezpośrednio, obserwuję następujące zachowanie:
$ sqlite3 database.db
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1 // as expected
sqlite> .quit
$ sqlite3 database.db
sqlite> PRAGMA foreign_keys;
0 // off ?!
Bez zamykania powłoki sqlite3, kluczy obcychpracują po ich aktywacji (i nie wychodzeniu z powłoki) inie wolno mi wstawiać wiersze z nieznanymi identyfikatorami aplikacji.