2010-06-11 37 views
8

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) 
) 

回答

12

由于the relevant docs说(在第2 启用外键支持):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

你有使用,在相关的连接PRAGMA? (假设,正如文档所言,sqlite是编译得当的,当然也是一个近期足够的版本来提供外键约束执行)。

+0

谢谢你这么多的迅速回应。我从来没有注意到在文档中(下次看起来会更困难)。刚刚试图运行该命令,我收到以下错误:“SQLite准备()失败。错误:授权被拒绝细节:未授权EXPRESSION:PRAGMA foreign_keys = ON;” 我假设他们正在使用的版本不支持它或已禁用功能。我可以使用触发器创建相同的最终结果吗?如果有的话,请为SQLITE提供一些示例触发器语法? – 2010-06-11 04:48:55

+0

@Maxim,我相信sqlite外键触发器需要与普通的旧外键完全相同的底层功能(通常在sqlite的嵌入式构建中被删除,它们希望比他们想要提供的“完全相关的ACID功能”更小且更快实质性能和足迹成本)。 – 2010-06-11 04:54:31

3

您还可以通过在ConnectionString中嵌入打开外键的支持:

foreign keys=True 

例子:

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