sqlite - 不存在的外键不会导致 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_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
,第一个结果
推荐阅读
- python - Pandas 在同一行检查 nan 值
- php - 使用 PHP 不显示图像
- amazon-ec2 - 如何限制仅从内部区域访问 ElasticBeanstalk 端口 80?
- python-3.x - Python3比较,在linux上执行脚本,输出错误
- arrays - 如何使用 mongoose find 按内部数组进行过滤
- python - DjangoRestAPI - 在运行您自己的函数(如事件处理程序)时使用 ModelViewSet 执行数据库管理
- python - Python中c-struct的反向解码功能
- reactjs - 使用 TypeScript 的 React 类型中不存在属性
- node.js - 如何在量角器Node.js中获取元素的x和y坐标
- python-3.x - Nix openai python开发环境构建失败