2013-03-08 3 views
10

Я использую 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.

+2

I думаю, что я могу ответить на свой вопрос (в комментарии вместо ответа из-за низкой репутации): в документации говорится: внешние ограничения по умолчанию отключены по умолчанию (для обратной совместимости), поэтому должны быть включены ** для каждой базы данных подключение отдельно **. Раздражает, но теперь это работает. – cara

+0

Связанный вопрос: если данные, нарушающие ограничение внешнего ключа, добавляются, а затем флаг foreign_keys установлен на: вызывает ли это ошибку? – gvrocha

ответ

19

Я думаю, что могу ответить на мой собственный вопрос: в документации говорится: внешние ограничения по умолчанию отключены по умолчанию (для обратной совместимости), поэтому должно быть включено для для каждого подключения к базе данных отдельно. Раздражает, но теперь это работает.

9

Поместите это в начало файла, который выполняет команды SQL, и он будет включать внешние ключи во время выполнения.

db = SQLite3::Database.new("database.db") 
db.execute("PRAGMA foreign_keys = ON") 
2

Один из способов включения постоянно foreign_keys по умолчанию, чтобы ввести следующую строку в ~/.sqliterc:

PRAGMA foreign_keys = ON; 

Обратите внимание, что это будет влиять на все ваши базы данных ...

Смежные вопросы