Согласно примечаниям к выпуску, драйвер 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 (без внешних ключей). Возможно ли, что их библиотека использует это? Как я могу это проверить? Если так, как я могу заставить его использовать другую версию?