如何在SQLite中默认启用外键级联删除?

7

SQLite v3.7.5

有没有办法使 SQLite 外键 默认启用 级联删除? 给出以下示例:

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

3个回答

4

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


3
不,即使使用编译时选项也不行。
到目前为止,唯一的方法是在运行时使用pragma foreign_keys=on。特别危险的是,每个访问数据库的应用程序都必须这样做。
如果某个特定的应用程序没有运行该pragma语句,则它可以插入违反外键约束的数据,而其他应用程序则不会知道。也就是说,打开外键不能警告您现有的违反约束的数据。

1

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

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

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

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


我希望有一个配置设置或类似的东西可以全局设置。看起来Paul的答案更像是连接字符串中的配置设置。 - Metro Smurf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接