未强制执行外键

Posted

技术标签:

【中文标题】未强制执行外键【英文标题】:Foreign key isn't being enforced 【发布时间】:2011-03-02 12:03:33 【问题描述】:

为什么 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)
)

【问题讨论】:

【参考方案1】:

正如the relevant docs 所说(在2.启用外键支持部分):

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

sqlite> PRAGMA foreign_keys = ON;

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

您是否在相关连接中使用过PRAGMA? (假设,正如文档所说,sqlite 已正确编译,并且当然还有一个足够新的版本来提供外键约束执行)。

【讨论】:

非常感谢您的及时回复。我从未在文档中注意到这一点(下次会更努力)。刚刚尝试运行该命令后,我收到以下错误:“SQLite prepare() failed. ERROR: authorization denied DETAILS: not authorized EXPRESSION: PRAGMA foreign_keys = ON;”我假设他们使用的版本不支持它或禁用了该功能。我可以使用触发器创建相同的最终结果吗?如果是这样,任何人都可以提供一些 SQLITE 的示例触发器语法吗? @Maxim,我相信 sqlite 外键触发器需要与普通旧外键完全相同的底层功能(通常在 SQLite 的嵌入式构建中被删除,这些构建想要比他们想要提供的更小更快“完全相关的 ACID 能力”,性能和占用空间成本很高)。【参考方案2】:

您也可以通过嵌入连接字符串来开启外键支持:

foreign keys=True

例子:

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

【讨论】:

以上是关于未强制执行外键的主要内容,如果未能解决你的问题,请参考以下文章

数据库设置主键外键

数据库主键外键

sql server的主键与外键问题

数据库开发基础-SQl Server 主键外键子查询(嵌套查询)

主键外键和子查询

3.啥是键、候选键、主键和外键?