Я использую Ruby с SQLite3, и мои попытки использовать внешние ключи в Sqlite3, к сожалению, не были успешными. Согласно sqlite3 --version
, установлена версия 3.7.13. Насколько я знаю, Sqlite3 поддерживает внешние ключи с версии 3.6.x.SQLite3 «забывает» использовать внешние ключи
Я знаю, что внешние ключи дезактивированы по умолчанию и должны быть активированы с помощью PRAGMA foreign_keys = ON;
. В моем рубиновом дб создать-скрипт, я делаю что-то вроде этого:
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.
I думаю, что я могу ответить на свой вопрос (в комментарии вместо ответа из-за низкой репутации): в документации говорится: внешние ограничения по умолчанию отключены по умолчанию (для обратной совместимости), поэтому должны быть включены ** для каждой базы данных подключение отдельно **. Раздражает, но теперь это работает. – cara
Связанный вопрос: если данные, нарушающие ограничение внешнего ключа, добавляются, а затем флаг foreign_keys установлен на: вызывает ли это ошибку? – gvrocha