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(沒有外鍵)安裝。他們的圖書館是否有可能使用它?我怎樣才能檢查這個?如果是這樣,我該如何使用其他版本?
根據手冊'enforceForeignKeys(true)'應該這樣做。我也嘗試手動設置編譯指示,但沒有改變。由於Xerial的文檔說外鍵是支持的,我想他們會用適當的選項編譯它。 – 2010-05-22 09:38:00
@Space:我可以報告的是,當我嘗試它時(使用另一種語言,所以我不會在這裏粘貼日誌),然後插入工作,除非我先發布PRAGMA。 – 2010-05-22 09:51:28