在SQLite中启用外键约束

pat*_*fox 33 c# sql sqlite ado.net foreign-keys

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

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

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

conn.Open();
SQLiteCommand cmd = new SQLiteCommand("PRAGMA foreign_keys = ON", conn);
cmd.ExecuteNonQuery(); 
conn.Close();
Run Code Online (Sandbox Code Playgroud)

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

小智 55

终于从这篇文章中弄清楚了这一点.PRAGMA foreign_key设置不​​会保留,但您可以在每次在ConnectionString中建立连接时进行设置.这允许您使用Visual Studio的表适配器.

  1. 确保安装了最新版本(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).

  • 令我震惊的是,在 2020 年 SQLite 仍然禁用外键约束,*即使在显式**启用**它们之后*!谈论重大数据损坏。 (2认同)

Mar*_*tos 6

打开pragma:

PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我也为这个问题苦苦挣扎。我决定研究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='
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个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='
Run Code Online (Sandbox Code Playgroud)

瞧!强制执行外键约束。