如何使用Xerial SQLite JDBC强制执行外键?

时间:2010-05-21 13:19:46

标签: sqlite macos foreign-keys java-native-interface jdbc

根据他们的发行说明,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 documentation中的样本。这应该是失败的,但事实并非如此。我也检查了,它确实插入了元组(没有忽略或类似的东西)。

有没有人有这方面的经验,或知道如何使它有效?

更新

我有一个为他们竞选的testcase from Xerial,但对我来说失败了。所以代码没有问题,但可能是设置。我在Mac OS上运行,并且安装了SQLite 3.6.12(无外键)。他们的图书馆有可能使用它吗?我怎么检查这个?如果是这样,我怎么能让它使用另一个版本?

1 个答案:

答案 0 :(得分:0)

默认情况下,外键执行已关闭。您需要使用PRAGMA来启用它:

PRAGMA foreign_keys = ON;

此外,SQLite库也必须使用外键支持构建。它可能已经过了。