开发者

How to enforce foreign keys using Xerial SQLite JDBC?

According to their release notes, the Xerial SQLite JDBC driver supports foreign keys since version 3.6.20.1. I have tried some time now to get a foreign key constraint to be enforced, but to no avail. Here is what I came up with:

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)");
}

The table definitions are taken directly from the sample in the SQLite documentation. This is supposed to fail, but it doesn't. I also checked, and it really inserts the tuple (no ignore or something like that).

Does anyone have any experience with that, or knows how to make it work?

Update

I got a testcase from Xerial that runs for them but fails for me. So there is nothing wrong with the code, but probably the setup. I run on Mac OS and this comes with SQLite 3.6.12 (no foreign keys) installed. Is it possible that their library uses this? 开发者_Go百科How can I check this? If so, how can I make it use another version?


Foreign key enforcement is off by default. You need to use a PRAGMA to switch it on:

PRAGMA foreign_keys = ON;

Moreover, the SQLite library must also have been built with foreign key support at all. It probably has been though.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜