Я использую Ruby с SQLite3, и мои попытки использовать внешние ключи в Sqlite3, к сожалению, не были успешными. В соответствии с sqlite3 --version
установлена версия 3.7.13. Насколько я знаю, Sqlite3 поддерживает внешние ключи с версии 3.6.x.
Я знаю, что внешние ключи дезактивируются по умолчанию и должны быть активированы с помощью PRAGMA foreign_keys = ON;
. В моем Ruby db-create- script я делаю что-то вроде этого:
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)
К сожалению, я могу с радостью вставлять строки в requests
с неизвестными приложениями, это работает, но, конечно, это не должно.
Интересно: напрямую используя оболочку sqlite3, я могу наблюдать следующее поведение:
$ 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 ?!
Без выхода из оболочки sqlite3 внешние ключи работают после их активации (и не покидают оболочку) и мне не разрешено вставлять строки с неизвестными app_ids.