7

SQLite v3.7.5

有没有办法在默认情况下启用SQLite 外键?cascade delete给定以下示例:

CREATE TABLE [Parent] (
[ParentId] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
[Name] VARCHAR(50)  UNIQUE NOT NULL
);

CREATE TABLE [Child] (
[ChildId] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[ParentId] INTEGER  NOT NULL,
[Name] VARCHAR(50)  NOT NULL,
FOREIGN KEY(ChildId) REFERENCES Child(ParentId) ON DELETE CASCADE
);

我能够启用级联删除的唯一方法是PRAGMA foreign_keys = true在事务之前执行命令:

using( var conn = new SQLiteConnection( _conn ) )
{
    conn.Open();
    var pragma = new SQLiteCommand( "PRAGMA foreign_keys = true;", conn );
    pragma.ExecuteNonQuery();

    var cmd = new SQLiteCommand( "Delete from Parent where ParentId = 1", conn );
    cmd.ExecuteNonQuery();
}

是否可以配置数据库级别的设置,而不必在每次事务之前调用 pragma 命令?

我已经看到了启用级联删除的触发器,但我正在寻找可以简单地PRAGMA foreign_keys = true在数据库级别启用的东西。

4

3 回答 3

4

System.Data.SQLite 1.0.66 没有它,但在它的存储库版本中,他们已经更新到 sqlite 3.7.4 并创建了一个新的连接字符串属性“外键”。谁知道什么时候正式发布?所以你可以在你的连接字符串中设置它。该项目现在住在这里: http: //system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

于 2011-02-13T00:51:15.837 回答
3

不,甚至没有编译时选项。

到目前为止,唯一的方法是pragma foreign_keys=on在运行时使用。特别危险的是每个接触数据库的应用程序都必须这样做。

如果特定应用程序不运行该 pragma 语句,它可以插入违反外键约束的数据,而其他应用程序将不知道。也就是说,打开外键不会警告您违反约束的现有数据。

于 2011-02-13T01:32:39.170 回答
1

不,目前没有办法(为了向后兼容)。请参阅您在 (2) 下提供的链接:

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

但是,这可能会在未来发生变化:

(但是请注意,SQLite 的未来版本可能会更改,以便默认启用外键约束。细心的开发人员不会对默认情况下是否启用外键做出任何假设,而是会根据需要启用或禁用它们。)

于 2011-02-12T23:40:29.580 回答