web-dev-qa-db-ja.com

SQLiteで外部キー制約を有効にする

SQLiteをC#で使用しており、外部キーが定義されたテーブルがいくつかあります。

これで、SQLiteではデフォルトで外部キー制約が強制されないことがわかりましたが、それらをオンにしたいと思います。

コードでこれを行うことは可能ですか?関連する question を調べましたが、C#コードでそれを行う方法がわかりません。テーブルの設計には、Visual Studio 2008で利用可能なSQLiteの最新のプラグインを使用しています。

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

この接続が再度開かれたときにこの変更を維持する必要があります。出来ますか?

34
patentfox

最後にこれを this post から理解しました。 PRAGMA foreign_key設定は持続しませんが、ConnectionStringで接続が行われるたびに設定できます。これにより、Visual Studioのテーブルアダプターを使用できます。

  1. System.data.sqliteの 最新バージョン (1.0.73.0)がインストールされていることを確認してください(1.0.66.0は機能しません)。
  2. ConnectionStringdata source=C:\Dbs\myDb.db;foreign keys=true;に変更します(C:\ Dbs\myDb.dbをsqliteデータベースに置き換えます)。
54
Jer K

プラグマをオンにします。

PRAGMA foreign_keys = ON;

これは、他のSQLステートメントと同じように実行できます。

6
Marcelo Cantos

別の解決策は、すべてのクエリで "PRAGMA foreign_keys = ON"を実行することです。

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

CommandTextを渡す関数に配置すると、再利用できます。

3
Chris Aelbrecht

私もこの問題に苦労しました。データベースへの接続時に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='

そして出来上がり!外部キー制約が実施されます。

3
Nigel

これらはあなたが探している情報を提供するはずです:

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はトリガーと外部キーサポートを有効にしてコンパイルする必要があります(これはバイナリ配布の場合)。

2
tdammers

接続文字列に追加:";EnforceFKConstraints=Yes|True|1;"

1
abatishchev

SQLコマンドPRAGMA foreign_keys = ON; SelectまたはUpdateステートメントと同じように、DB接続で。ただし、SQLiteが外部キーなどでコンパイルされていることを確認する必要があります。 ここ を参照してください。

1
pinkfloydx33