2011-01-06 15 views
4

プログラムで外部キーを使用する必要がありますが、C言語を使用してこのPRAGMAをアクティブにする方法はわかりません。 (私はCASCADEモードを使いたいです。)sqliteを使用して、Cで外部キーをアクティブにするにはどうすればよいですか?

sqliteバイナリでは、私はちょうどと書いています。PRAGMA foreign_keys = on;と動作します。

私の質問は:どのように私はCでこれを行うことができますか?

答えて

5

の部分では、SQLLiteマニュアルは言う:SQLiteの中で外部キー制約を使用するためには

、ライブラリはSQLITE_OMIT_FOREIGN_KEYまたはSQLITE_OMIT_TRIGGER定義さもないとコンパイルする必要があります。 SQLITE_OMIT_TRIGGERが定義されているがSQLITE_OMIT_FOREIGN_KEYが定義されていない場合、SQLiteはバージョン3.6.19以前と同じように動作します - 外部キー定義は解析され、PRAGMA foreign_key_listを使用してクエリできます。この構成では、PRAGMA foreign_keysコマンドはno-opです。 OMIT_FOREIGN_KEYが定義されている場合、外部キー定義は解析さえできません(外部キー定義の指定は構文エラーです)。

外部キー制約を有効にしてライブラリをコンパイルすると、実行時にPRAGMA foreign_keysコマンドを使用してアプリケーションで有効にする必要があります。たとえば:

sqlite> PRAGMA foreign_keys = ON; 

外部キー制約が(後方互換性のため)デフォルトでは無効になっているので、個別に各データベース接続のために個別に有効にする必要があります。ただし、将来のリリースのSQLiteは、デフォルトで外部キー制約が有効になるように変更される可能性があるので注意してください。外部キーがデフォルトで有効になっているかどうかについては、慎重な開発者は仮定しません。アプリケーションはPRAGMA foreign_keysステートメントを使用して、外部キーが現在使用可能かどうかを判別することもできます。

そしてpragmasについてのページは言う:

  • 固有のプラグマ・ステートメントを除去し、他の人はSQLiteのの将来のリリースで追加することができます。下位互換性の保証はありません。
  • 未知のプラグマが発行されると、エラーメッセージは生成されません。未知のプラグマは単に無視されます。つまり、プラグマステートメントにタイプミスがあった場合、ライブラリはユーザにその旨を通知しません。
  • 一部のプラグマは、実行ステージではなくSQLコンパイルステージで有効になります。 、sqlite3_step()、sqlite3_finalize()API(またはラッパーインタフェースの同様の)をC言語sqlite3_prepare()を使用している場合、この手段は、プラグマはない通常のSQLとしてsqlite3_step()呼び出しの間に、sqlite3_prepare()呼び出し中に実行することができますステートメントは行います。または、通常のSQL文と同様に、プラグマはsqlite3_step()の実行中に実行される可能性があります。プラグマがsqlite3_prepare()またはsqlite3_step()の実行中であるかどうかは、プラグマとSQLiteの特定のリリースによって異なります。

したがって、PRAGMA文を準備して、それが有効になるように実行します。

もっと特殊化されたAPIがあるかもしれません。あなたもマニュアルを読むことができます。

+0

ありがとう、しかし、試みた:sqlite3_prepare(db、 "PRAGMA foreign_keys = ON;"、-1、&stmt、0); sqlite3_step(stmt);ステップの結果はSQLITE_DONEですが、まだ外部キーは機能していません。 – Fabiano

+0

SQLiteライブラリの構築方法を確認しましたか?最初の引用符の要件に注意してください - 外部キーを有効にするためにSQLiteを構築する必要があります。 –

+0

ITの働き!!なぜか分からないけど、コンパイルテストをするためにPCを変更して、動作している!非常にありがとう、男!私は感謝します。 – Fabiano

2

Cはまったく同じです。文"PRAGMA foreign_keys = ON"を実行するだけです。

+0

でも、どうですか? sqlite3_exec(db、 "PRAGMA foreign_keys = ON"、NULL、NULL、NULL); – Fabiano

+0

さて、「うまくいけない」とは、多くのことを意味することがあります。 SQLite APIを呼び出すたびにエラーをチェックする必要があります。あなたはいつでもエラーになりますか?そうでない場合、それはどのように動作しないことを知っていますか? –

+0

Sorry ..戻り値はSQLITE_OKですが、私はsqliteで別のサンプルテストと一緒にCコードを作成しているので、それを話しました。最初にC関数でCREATE TABLEを実行した後、同じSQLを使って同じことをしてから、他のクエリを実行します。Cプログラムの外部テーブル(UPDATE)で1つの値を変更しようとすると、何も起こっておらず、sqliteでは、メインテーブルのすべての値が変更されます。 (申し訳ありません私の英語、私はブラジル人です) – Fabiano

関連する問題