2011-01-06 17 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命令在此配置中是無操作的。如果定義了OMIT_FOREIGN_KEY,則甚至不能分析外鍵定義(試圖指定外鍵定義是語法錯誤)。

假設庫已啓用外鍵約束編譯,它仍然必須由應用程序在運行時使用PRAGMA foreign_keys命令啓用。例如:

sqlite> PRAGMA foreign_keys = ON; 

外鍵約束默認(向後兼容)禁用,所以必須分別對每個數據庫連接單獨啓用。 (但是,請注意,未來的SQLite版本可能會更改,以便默認情況下啓用外鍵約束。仔細的開發人員不會假定是否默認啓用外鍵,而是根據需要啓用或禁用它們。)應用程序也可以使用PRAGMA foreign_keys語句來確定當前是否啓用了外鍵。

而關於pragmas頁說:

  • 具體的註記語句可以被移除和其他的SQLite的未來版本中加入。不保證向後兼容性。
  • 如果發出未知的附註,則不會生成錯誤消息。未知的編譯指示簡單地被忽略。這意味着如果在編譯指示語句中存在拼寫錯誤,庫不會通知用戶這一事實。
  • 一些編譯指示在SQL編譯階段生效,而不是執行階段。這意味着如果使用C語言sqlite3_prepare(),sqlite3_step(),sqlite3_finalize()API(或類似的封裝器接口),則該編譯指示可以在sqlite3_prepare()調用期間運行,而不是在sqlite3_step()調用期間作爲普通SQL聲明做。或者,編譯器可能會在sqlite3_step()期間運行,就像正常的SQL語句一樣。是否在sqlite3_prepare()或sqlite3_step()期間運行編譯指示取決於編譯指示和SQLite的特定版本。

因此,您準備PRAGMA語句 - 並執行它以確保其生效。

可能有更專門的API;你也可以閱讀手冊。

2

C完全相同 - 只需執行語句"PRAGMA foreign_keys = ON"即可。

+0

好的,但如何? sqlite3_exec(db,「PRAGMA foreign_keys = ON」,NULL,NULL,NULL);不要工作 – Fabiano 2011-01-06 17:18:50

+0

那麼,「不工作」可能意味着很多事情。每次調用SQLite API後,都應該檢查錯誤。在任何時候你有錯誤嗎?如果沒有,你怎麼知道它不起作用? – 2011-01-06 17:39:04