小编典典

SQLite3“ orgets”使用外键

sql

我将Ruby与SQLite3结合使用,但不幸的是,我在Sqlite3中使用外键的尝试均未成功。根据sqlite3 --version,安装了版本3.7.13。据我所知,Sqlite3从3.6.x版本开始支持外键。

我知道默认情况下外键是禁用的,必须使用来激活PRAGMA foreign_keys = ON;。在我的db-create-script
Ruby中,我正在执行以下操作:

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未知的应用程序ID,它可以工作,但当然不行。

有趣的是:直接使用sqlite3 shell,我可以观察到以下行为:

$ 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的外壳,外键 正在 激活他们(而不是退出Shell)后 我不能 与未知app_ids插入行。


阅读 242

收藏
2021-03-23

共1个答案

小编典典

我想我可以回答我自己的问题:文档说:外键约束默认情况下是禁用的(为了向后兼容),因此必须分别为 每个数据库连接
启用外键约束。烦人,但现在终于可以使用了。

2021-03-23