【问题标题】:Foreign key constraint not working in sqlite3外键约束在 sqlite3 中不起作用
【发布时间】:2022-12-22 03:32:22
【问题描述】:
  • 蟒蛇版本:3.8.10
  • sqlite3.version:2.6.0
  • sqlite3.sqlite_version:3.31.1

我有两个表:blocklistblocklist_reasons。见下文:

blocklist_reasons
id | reason
--------------------------
1  | Source not supported

blocklist
id | link            | reason
-----------------------------
1  | https://mega.nz | 1

blocklist.reason引用了blocklist_reasons.id,所以设置了外键约束。

但是,我可以插入任何我想要的数字,它仍然会接受它,这很奇怪:

sqlite> INSERT INTO blocklist(link, reason) VALUES ('https://example.com', 2);
sqlite> -- No problems eventhough there is no row in blocklist_reasons with ID 2???
sqlite> SELECT * FROM blocklist;
1|https://mega.nz|1
2|https://example.com|2

我能够使用以下代码重现此问题:

-- Create reasons table and add one reason with ID 1
CREATE TABLE blocklist_reasons(
    id INTEGER PRIMARY KEY,
    reason TEXT NOT NULL UNIQUE
);
INSERT INTO blocklist_reasons(reason) VALUES ('Source not supported');
SELECT * FROM blocklist_reasons;
1|Source not supported

-- Create blocklist table and insert row with reason ID set as ID 2 without errors
CREATE TABLE blocklist(
    id INTEGER PRIMARY KEY,
    link TEXT NOT NULL,
    reason INTEGER NOT NULL,
    FOREIGN KEY (reason) REFERENCES blocklist_reasons(id)
);
INSERT INTO blocklist(link, reason) VALUES ('https://mega.nz', 2);
SELECT * FROM blocklist;
1|https://mega.nz|2

您可以看到我插入了一行,其中 reason 列设置为 2 并且它工作正常,尽管 blocklist_reasons 表中没有 ID 为 2 的行。为什么不提高外键约束一个错误?

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:

    结果我不得不使能够外键检查。在我看来愚蠢但没关系。每次启动数据库连接(不是游标连接而是数据库连接)时,运行以下命令:

    PRAGMA foreign_keys = ON;
    

    这会启用约束。

    【讨论】:

      猜你喜欢
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2013-03-04
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多