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
的东西。
答案 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的未来版本可能会更改,以便默认启用外键约束。小心的开发人员不会对默认情况下是否启用外键进行任何假设,而是在必要时启用或禁用它们。)