【发布时间】:2022-12-22 03:32:22
【问题描述】:
- 蟒蛇版本:3.8.10
-
sqlite3.version:2.6.0 -
sqlite3.sqlite_version:3.31.1
我有两个表:blocklist 和blocklist_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 的行。为什么不提高外键约束一个错误?
【问题讨论】: