为啥 SQLite pragma foreign_keys 在数据库连接中不持久?
Posted
技术标签:
【中文标题】为啥 SQLite pragma foreign_keys 在数据库连接中不持久?【英文标题】:Why is SQLite pragma foreign_keys not persistent across DB connections?为什么 SQLite pragma foreign_keys 在数据库连接中不持久? 【发布时间】:2020-11-11 11:45:26 【问题描述】:我发现自己调试了为什么 ON DELETE CASCADE
不起作用,直到意识到必须为 每个 数据库连接启用外键,PRAGMA foreign_keys = <boolean>;
(参考:https://www.sqlite.org/pragma.html#pragma_foreign_keys)。
从开发的角度来看,我觉得管理何时启用/禁用 SQLite 外键很复杂。为了安全起见,对于每个连接,我宁愿将此语句与ON
挂钩。但后来我想知道在 DB 连接中不保持这种设置的实际惩罚或原因是什么。
所以我的问题是:
-
为什么 SQLite 没有选择默认启用外键?
假设 1. 有充分的理由,为什么 SQLite 不选择在数据库文件或表级别保留此设置,而不是每个连接?
您能否说明为不需要外键的操作启用外键会造成多大的损失?
如果重要的话,我使用的是 SQLite 的 C 实现,版本 3.22.0。
【问题讨论】:
【参考方案1】:自version 3.6.19 (2009-10-14)以来,SQLite 支持外键约束。
对于您的第一个问题,来自Enabling Foreign Key Support:
默认禁用外键约束(用于向后 兼容性),因此必须为每个数据库单独启用 联系。 (但是请注意,SQLite 的未来版本可能 更改以便默认启用外键约束。小心 开发商不会对是否外国做任何假设 默认情况下启用键,但将启用或禁用它们 必要的。)
至于您的其他问题,您可以阅读SQLite Forum / Why is foreign key support based on the connection? 以了解其他人如何处理此功能/问题。
这个线程中有趣的部分,你也可以在Compile-time Options 中找到,你可以编译核心库,编译时间常数SQLITE_DEFAULT_FOREIGN_KEYS
设置为1
(= ON
) 并获得你自己的 SQLite 风格.
【讨论】:
感谢您在 SQLite 论坛上指出完全相同的问题。听起来是正确的答案。我还发现this scenario 特别适合为每个连接证明此标志:“如果您有一个已经被引用表过滤的批量更新,则对外键约束的额外检查是不必要的开销。”。这样可以提高性能。以上是关于为啥 SQLite pragma foreign_keys 在数据库连接中不持久?的主要内容,如果未能解决你的问题,请参考以下文章
android.database.sqlite.SQLiteException:在“Foreign”附近:语法错误(代码 1):
如何在SQLite中添加自己的PRAGMA语句来存储自定义元数据?
SQLite pragma 命令中的 Android Studio 标记错误,<pragma value> 应为“ON”