首页 > 解决方案 > 不存在的外键不会导致 SQLite 中的错误

问题描述

以下代码应 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

解决方案


相关文档

为了在 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,第一个结果


推荐阅读