不存在的外键不会在SQLite中引起错误

时间:2019-05-29 23:04:44

标签: 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");

1 个答案:

答案 0 :(得分:0)

来自the relevant documentation

  

为了在SQLite中使用外键约束,必须在未定义SQLITE_OMIT_FOREIGN_KEYSQLITE_OMIT_TRIGGER的情况下编译库。如果定义了SQLITE_OMIT_TRIGGER但未定义SQLITE_OMIT_FOREIGN_KEY,则SQLite的行为与版本3.6.19(2009-10-14)之前的行为相同-解析外键定义,并可以使用{{1 }},但不执行外键约束。

和:

  

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

和:

  

假定在编译库时启用了外键约束,则应用程序仍必须在运行时使用PRAGMA foreign_key_list命令将其启用。例如:

     

PRAGMA foreign_keys

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

来源: Google PRAGMA foreign_keys = ON,第一个结果