如何通过 Java 在 SQLite 中强制实施外键约束?

2022-09-02 05:08:19

默认情况下,SQLite 似乎不强制执行外键。我正在使用sqlitejdbc-v056.jar并且我已经读到使用将打开外键约束,并且这需要在每个连接的基础上打开。PRAGMA foreign_keys = ON;

我的问题是:我需要执行哪些Java语句才能打开此命令?我试过了:

connection.createStatement().execute("PRAGMA foreign_keys = ON");

Properties properties = new Properties();
properties.setProperty("PRAGMA foreign_keys", "ON");
connection = DriverManager.getConnection("jdbc:sqlite:test.db", properties);

connection = DriverManager.getConnection("jdbc:sqlite:test.db;foreign keys=true;");

但这些都不起作用。我在这里错过了什么吗?

我已经看到了这个答案,我想做同样的事情,只使用JDBC。


答案 1

代码是这样的:

DriverManager.getConnection("jdbc:sqlite:some.db;foreign keys=true;")

不起作用。您必须在从 DriverManager 调用 getConnection 时将其创建并设置为属性。org.sqlite.SQLiteConfig

public static final String DB_URL = "jdbc:sqlite:database.db";  
public static final String DRIVER = "org.sqlite.JDBC";  

public static Connection getConnection() throws ClassNotFoundException {  
    Class.forName(DRIVER);  
    Connection connection = null;  
    try {  
        SQLiteConfig config = new SQLiteConfig();  
        config.enforceForeignKeys(true);  
        connection = DriverManager.getConnection(DB_URL,config.toProperties());  
    } catch (SQLException ex) {}  
    return connection;  
}

此代码取自


答案 2

当您查看SQLite外键支持页面时,我会解释为

  1. SQLlite 必须使用外键支持进行编译
  2. 您仍然必须为使用PRAGMA的每个连接打开它
  3. 您必须在创建表时将外键定义为约束

Ad 1)引用自这里

如果命令“PRAGMA foreign_keys”不返回任何数据,而不是包含“0”或“1”的单行,则您使用的SQLite版本不支持外键(因为它早于3.6.19,或者因为它是使用SQLITE_OMIT_FOREIGN_KEY编译的,或者SQLITE_OMIT_TRIGGER定义)。

您的结果是什么?PRAGMA foreign_keys;

更新:从您的评论中我看到您正在使用3.6.14.2,这意味着您的版本不支持外键约束!所以你必须更新SQLite,如果可能的话!

Ad 2)你的第一个代码片段执行PRAGMA作为语句,我认为这不会起作用。根据您的注释,第三个截图不起作用:SQLite驱动程序将整个字符串解释为数据库的位置,而不是将“外键=true”部分作为连接设置”。因此,只有第二个代码段才有效。

Ad 3) 您是否创建了支持外键的表?引用自这里

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER, 
  trackname   TEXT, 
  trackartist INTEGER,
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);

推荐