未强制执行外键

Foreign key isn't being enforced

提问人:Maxim Gershkovich 提问时间:6/11/2010 最后编辑:skinkMaxim Gershkovich 更新时间:2/15/2017 访问量:5435

问:

为什么SQLite没有强制执行以下外键约束(尽管执行良好?我该如何执行这种关系?

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY,
    FirstName TEXT NOT NULL,
    LastName TEXT NOT NULL,
    Username TEXT NOT NULL,
    Password TEXT NOT NULL,
    Email TEXT NOT NULL,
    SignupDate TEXT NOT NULL
)

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY,
    UserID TEXT,
    FOREIGN KEY(UserID) REFERENCES User(UserID)
)
SQLite 谷歌齿轮

评论


答:

30赞 Alex Martelli 6/11/2010 #1

正如相关文件所说(在第 2 节中)。启用外键支持):

假设库是用 启用外键约束,它 仍必须由 应用程序在运行时,使用 PRAGMA foreign_keys命令。为 例:

sqlite> PRAGMA foreign_keys = ON;

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

您是否在相关方面使用过它?(当然,假设 sqlite 编译得当,并且还有一个足够新的版本来提供外键约束强制执行)。PRAGMA

评论

1赞 Maxim Gershkovich 6/11/2010
非常感谢您的及时回复。我从来没有注意到文档中的内容(下次会更难看)。刚刚尝试运行该命令后,我收到以下错误:“SQLite prepare() failed.错误:授权被拒绝 详细信息:未授权 表达式:编译指示 foreign_keys = ON;”我假设他们使用的版本不支持它或已禁用该功能。我可以使用触发器创建相同的最终结果吗?如果是这样,任何人都可以提供一些SQLITE的示例触发器语法吗?
0赞 Alex Martelli 6/11/2010
@Maxim,我相信 sqlite 外键触发器需要与普通旧外键完全相同的底层功能(通常在 sqlite 的嵌入式版本中删除,这些版本希望更小、更快,而不是他们希望以巨大的性能和占用空间成本提供“完整的关系 ACID 能力”)。
6赞 Richard Anderssen 2/15/2017 #2

还可以通过在 connectionstring 中嵌入来启用外键支持:

foreign keys=True

例:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture"

评论

0赞 Masklinn 9/13/2022
读者请注意:这是针对 ODBC 连接字符串的,而不是针对 sqlite 自己的 uri 文件名。截至 2022 年,sqlite 不支持直接通过 uri 文件名启用 FK。