2010-05-21 65 views
1

根據其發行說明,Xerial SQLite JDBC驅動程序支持自3.6.20.1版起的外鍵。我已經嘗試了一段時間來獲得外鍵約束來執行,但無濟於事。以下是我想出了:如何使用Xerial SQLite JDBC強制執行外鍵?

public static void main(String[] args) throws ClassNotFoundException, SQLException { 
     Class.forName("org.sqlite.JDBC"); 

     SQLiteConfig config = new SQLiteConfig(); 
     config.enforceForeignKeys(true); 
     Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:", config.toProperties()); 

     connection.createStatement().executeUpdate(
       "CREATE TABLE artist(" + 
       "artistid INTEGER PRIMARY KEY, " + 
       "artistname TEXT);"); 
     connection.createStatement().executeUpdate(
       "CREATE TABLE track("+ 
         "trackid  INTEGER," + 
         "trackname TEXT," + 
         "trackartist INTEGER," + 
         "FOREIGN KEY(trackartist) REFERENCES artist(artistid)" + 
       ");"); 
     connection.createStatement().executeUpdate(
       "INSERT INTO track VALUES(14, 'Mr. Bojangles', 3)"); 
} 

表的定義是直接從樣品中取出的SQLite documentation。這應該會失敗,但事實並非如此。我也檢查過,它真的插入了元組(不要忽略或者類似的東西)。

有沒有人有這方面的經驗,或知道如何使它工作?

更新

我得到了他們運行,但失敗對我來說是testcase from Xerial。所以代碼沒有錯,但可能是設置。我在Mac OS上運行,這與SQLite 3.6.12(沒有外鍵)安裝。他們的圖書館是否有可能使用它?我怎樣才能檢查這個?如果是這樣,我該如何使用其他版本?

回答

0

默認情況下,外鍵執行處於關閉狀態。你需要使用一個PRAGMA將其打開:

PRAGMA foreign_keys = ON; 

此外,SQLite庫還必須已經建立與國外關鍵支撐可言。它可能是,但。

+1

根據手冊'enforceForeignKeys(true)'應該這樣做。我也嘗試手動設置編譯指示,但沒有改變。由於Xerial的文檔說外鍵是支持的,我想他們會用適當的選項編譯它。 – 2010-05-22 09:38:00

+0

@Space:我可以報告的是,當我嘗試它時(使用另一種語言,所以我不會在這裏粘貼日誌),然後插入工作,除非我先發布PRAGMA。 – 2010-05-22 09:51:28