2010-06-11 107 views
8

SQLite爲什麼不強制執行以下外鍵約束(雖然執行正常)?我該如何去執行這種關係?外鍵沒有被強制執行

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY, 
    FirstName TEXT NOT NULL, 
    LastName TEXT NOT NULL, 
    Username TEXT NOT NULL, 
    Password TEXT NOT NULL, 
    Email TEXT NOT NULL, 
    SignupDate TEXT NOT NULL 
) 

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY, 
    UserID TEXT, 
    FOREIGN KEY(UserID) REFERENCES User(UserID) 
) 

回答

12

由於the relevant docs說(在第2 啓用外鍵支持):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

你有使用,在相關的連接PRAGMA? (假設,正如文檔所言,sqlite是編譯得當的,當然也是一個近期足夠的版本來提供外鍵約束執行)。

+0

謝謝你這麼多的迅速回應。我從來沒有注意到在文檔中(下次看起來會更困難)。剛剛試圖運行該命令,我收到以下錯誤:「SQLite準備()失敗。錯誤:授權被拒絕細節:未授權EXPRESSION:PRAGMA foreign_keys = ON;」 我假設他們正在使用的版本不支持它或已禁用功能。我可以使用觸發器創建相同的最終結果嗎?如果有的話,請爲SQLITE提供一些示例觸發器語法? – 2010-06-11 04:48:55

+0

@Maxim,我相信sqlite外鍵觸發器需要與普通的舊外鍵完全相同的底層功能(通常在sqlite的嵌入式構建中被刪除,它們希望比他們想要提供的「完全相關的ACID功能」更小且更快實質性能和足跡成本)。 – 2010-06-11 04:54:31

3

您還可以通過在ConnectionString中嵌入打開外鍵的支持:

foreign keys=True 

例子:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture"