I'm using Ruby with SQLite3 and my attempts to use foreign keys in Sqlite3 were unfortunately not successful. According to sqlite3 --version
, version 3.7.13 is installed. As far as I know, Sqlite3 supports foreign keys since version 3.6.x.
I know that foreign keys are deactivated by default and have to be activated with PRAGMA foreign_keys = ON;
. In my Ruby db-create-script, I'm doing something like this:
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), ); ...SQLdb.execute_batch(sql)
Unfortunately, I can happily insert rows into requests
with unknown app-ids, it works, but of course it shouldn't.
Interesting: using the sqlite3 shell directly, I can observe the following behaviour:
$ sqlite3 database.dbsqlite> PRAGMA foreign_keys = ON;sqlite> PRAGMA foreign_keys;1 // as expectedsqlite> .quit$ sqlite3 database.dbsqlite> PRAGMA foreign_keys;0 // off ?!
Without quitting the sqlite3 shell, foreign keys are working after activating them (and not quitting the shell) and I'm not allowed to insert rows with unknown app_ids.