Как применить внешние ключи, используя Xerial SQLite JDBC? - PullRequest
1 голос
/ 21 мая 2010

Согласно примечаниям к выпуску, драйвер Xerial SQLite JDBC поддерживает внешние ключи начиная с версии 3.6.20.1. Я уже некоторое время пытался применить ограничение внешнего ключа, но безрезультатно. Вот что я придумал:

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 . Это должно провалиться, но это не так. Я также проверил, и он действительно вставляет кортеж (не игнорировать или что-то в этом роде).

Кто-нибудь имеет с этим опыт или знает, как заставить это работать?

Обновление

Я получил тестовый пример от Xerial , который работает для них, но не для меня. Так что нет ничего плохого в коде, но, вероятно, настройки. Я работаю на Mac OS и поставляется с SQLite 3.6.12 (без внешних ключей). Возможно ли, что их библиотека использует это? Как я могу это проверить? Если так, как я могу заставить его использовать другую версию?

1 Ответ

0 голосов
/ 22 мая 2010

Применение внешнего ключа по умолчанию отключено. Вам нужно использовать PRAGMA , чтобы включить его:

PRAGMA foreign_keys = ON;

Более того, библиотека SQLite также должна быть построена с поддержкой внешних ключей. Хотя, вероятно, было.

...