在 SQLite3 中,默认情况下不强制执行外键约束。这种行为与大多数其他关系数据库管理系统 (RDBMS) 不同,导致习惯于强健约束实施的开发人员感到困惑。
考虑以下示例:我们创建两个表,Persons Orders,Orders 中的外键约束引用了 Persons 中的主键。尽管定义了这个约束,我们仍然可以将行插入到 Orders 中,而在 Persons 中没有相应的记录。
在 SQLite3 版本 3.x 及更低版本中,必须显式外键约束每次连接到数据库时使用以下查询启用:
PRAGMA foreign_keys = ON;
这是因为 SQLite3 保持与其早期版本的向后兼容性, SQLite2.x,不支持外键约束。
默认禁用外键强制执行的决定主要是由 SQLite 作为嵌入式数据库的传统驱动的,用于性能至关重要的应用程序。外键约束会影响性能,尤其是在高并发场景下。
在 SQLite4.x 中,默认启用外键约束。此更改解决了当前行为引起的潜在混乱和挫败感。
在提供的示例的上下文中,应该执行 PRAGMAforeign_keys = ON;启用外键强制执行的语句。之后,向 Orders 中插入记录而在 Persons 中没有对应的记录时将导致错误,正如预期的那样。
以上是为什么 SQLite3 默认不强制执行外键约束?的详细内容。更多信息请关注PHP中文网其他相关文章!