在SQLite中启用外键约束

时间:2010-11-23 09:14:16

标签: c# sql sqlite ado.net foreign-keys

我正在使用SQLite和C#,并且有一些表定义了外键。

现在,我知道默认情况下,SQLite中没有强制执行外键约束,但我想将它们打开。

是否可以通过代码执行此操作?我查找了一个相关的question,但我不知道如何通过C#代码来完成它。我正在使用Visual Studio 2008中最新的SQLite插件来设计我的表。

conn.Open();
SQLiteCommand cmd = new SQLiteCommand("PRAGMA foreign_keys = ON", conn);
cmd.ExecuteNonQuery(); 
conn.Close();

重新打开此连接时,我需要保持此更改。有可能吗?

8 个答案:

答案 0 :(得分:54)

最后从this post得出结论。 PRAGMA foreign_key设置不​​会保留,但您可以在每次在 ConnectionString 中建立连接时进行设置。这允许您使用Visual Studio的表适配器。

  1. 确保安装了latest version(1.0.73.0)system.data.sqlite(1.0.66.0不起作用)。
  2. ConnectionString 更改为data source=C:\Dbs\myDb.db;foreign keys=true;(用您的sqlite数据库替换C:\ Dbs \ myDb.db)。

答案 1 :(得分:6)

打开编译指示:

PRAGMA foreign_keys = ON;

您可以像执行任何其他SQL语句一样执行此操作。

答案 2 :(得分:3)

另一个解决方案是对每个查询执行“PRAGMA foreign_keys = ON”。

    SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbSQLite + ";Read Only=False;");
    connection.Open();
    SQLiteCommand mycommand = new SQLiteCommand(connection);
    mycommand.CommandText = "PRAGMA foreign_keys=ON";
    mycommand.ExecuteNonQuery();
    mycommand.CommandText = "DELETE FROM table WHERE ID=x";
    mycommand.ExecuteReader();
    connection.Close();

如果将它放在传递CommandText的函数中,则可以重复使用它。

答案 3 :(得分:3)

我也很难解决这个问题。我决定在连接到数据库时调查SQLDriverConnect()中生成的完整连接字符串。这是它返回的内容:

'Driver={SQLite3 ODBC Driver};Database=C:\Users\Staples\Documents\SQLLiteTest.s3db;StepAPI=;SyncPragma=;NoTXN=;Timeout=;ShortNames=;LongNames=;NoCreat=;NoWCHAR=;FKSupport=;JournalMode=;OEMCP=;LoadExt=;BigInt=;PWD='

如您所见,有一个FKSupport属性。 将FKSupport=True;添加到我的连接字符串后,它返回了:

'Driver={SQLite3 ODBCDriver};Database=C:\Users\Staples\Documents\SQLLiteTest.s3db;StepAPI=;SyncPragma=;NoTXN=;Timeout=;ShortNames=;LongNames=;NoCreat=;NoWCHAR=;FKSupport=True;JournalMode=;OEMCP=;LoadExt=;BigInt=;PWD='

瞧!外键约束是强制执行的。

答案 4 :(得分:2)

这些应该提供您正在寻找的信息:

http://www.sqlite.org/faq.html#q22

http://www.sqlite.org/foreignkeys.html#fk_enable

简而言之,3.6.19之前的版本根本不强制执行外键,但可以使用触发器模拟它们;从3.6.19开始,可以强制执行外键,但是需要使用PRAGMA foreign_keys = ON语句为每个连接启用,并且必须在启用触发器和外键支持的情况下编译sqlite(我希望它是任何二元分布的情况。)

答案 5 :(得分:1)

看起来您可以像在Select或Update语句上一样在数据库连接上执行SQL命令PRAGMA foreign_keys = ON;。虽然您必须确保您的SQLite是使用外键等编译的。请参阅Here

答案 6 :(得分:1)

添加到您的连接字符串:";EnforceFKConstraints=Yes|True|1;"

答案 7 :(得分:-1)

In C++ store app the following code helped me to enable PRAGMA foreign_keys
sqlite3_stmt* stmt;
sqlite3_prepare(db, "PRAGMA foreign_keys = ON;", -1, &stmt, 0); 
sqlite3_step(stmt);

I called this after creating db using the call of 

int rc = sqlite3_open16(path->Data(), &db);