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

时间:2011-02-12 23:35:22

标签: c# sqlite foreign-keys system.data.sqlite

SQLite v3.7.5

默认情况下是否可以启用cascade delete启用SQLite Foreign Keys? 给出以下示例:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

  

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

但是,将来可能会改变这种情况:

  

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