【问题标题】:Non-existent foreign key doesn't cause error in SQLite不存在的外键不会导致 SQLite 中的错误
【发布时间】:2019-05-30 07:24:29
【问题描述】:

以下代码应 IMO 产生错误,因为 user_id=1 不存在。为什么会起作用?

CREATE TABLE users (
user_id int PRIMARY KEY,
email text UNIQUE
);

CREATE TABLE claimed (
account_id int PRIMARY KEY,
user_id int,
domain text,
FOREIGN KEY (user_id) REFERENCES users (user_id)
);

INSERT INTO claimed
(user_id, domain)
VALUES (1, "abcd");

【问题讨论】:

标签: sqlite


【解决方案1】:

来自the relevant documentation

为了在 SQLite 中使用外键约束,编译库时必须既不定义 SQLITE_OMIT_FOREIGN_KEY 也不定义 SQLITE_OMIT_TRIGGER。如果 SQLITE_OMIT_TRIGGER 已定义但 SQLITE_OMIT_FOREIGN_KEY 未定义,则 SQLite 的行为与版本 3.6.19 (2009-10-14) 之前的行为相同 - 外键定义被解析并可使用 PRAGMA foreign_key_list 进行查询,但外键不强制执行约束。

和:

默认禁用外键约束(为了向后兼容),因此必须为每个数据库连接单独启用。

和:

假设库是在启用外键约束的情况下编译的,它仍必须由应用程序在运行时使用PRAGMA foreign_keys 命令启用。例如:

sqlite> PRAGMA foreign_keys = ON;

显然,您应该在连接顶部使用PRAGMA foreign_keys = ON,并可能使用适当的选项进行重建(尽管如果您从包安装,那么我个人认为这已经完成)。

来源:谷歌sqlite foreign key,第一个结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2011-07-09
    • 2011-09-14
    • 2018-10-20
    • 2016-03-09
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多