如何通过UCanAccess创建一个包含两个外键引用到另一个表的表?

时间:2018-03-07 19:52:25

标签: java ucanaccess

直接在MS-Access中构建引用是没有问题的。 使用UCanAccess执行此操作会产生“net.ucanaccess.jdbc.UcanaccessSQLException:...”。

Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection connection = DriverManager.getConnection("jdbc:ucanaccess://e:/TestDB.accdb;memory=true");
Statement statement = connection.createStatement();
//
String tableToBeReferenced = "PersonsTable";
String tableWithTheReferences = "RelationShipsTable";

try {// Tidy up
 statement.execute("DROP TABLE " + tableWithTheReferences);
} catch (Exception exeption) {}
try {// Tidy up
 statement.execute("DROP TABLE " + tableToBeReferenced);
} catch (Exception exeption) {}

statement.execute("CREATE TABLE " + tableToBeReferenced + "(ID autoincrement NOT NULL PRIMARY KEY,"//
    + "Name VARCHAR(255)"//
    + ")");

statement.execute("CREATE TABLE " + tableWithTheReferences + "(ID LONG NOT NULL PRIMARY KEY,"//
    + "RelationShip VARCHAR(255) NOT NULL DEFAULT 'FRIENDS',"//
    + "Person1Id LONG NOT NULL,"//
    + "Person2Id LONG NOT NULL)");

// reference #1
statement.execute("ALTER TABLE " + tableWithTheReferences + //
    " ADD CONSTRAINT FOREIGN_KEY_1 FOREIGN KEY (Person1Id) REFERENCES " //
    + tableToBeReferenced + "(ID) ON DELETE CASCADE");

// reference #2
statement.execute("ALTER TABLE " + tableWithTheReferences + //
    " ADD CONSTRAINT FOREIGN_KEY_2 FOREIGN KEY (Person2Id) REFERENCES " //
    + tableToBeReferenced + "(ID) ON DELETE CASCADE");

如果我只创建它的第一个参考。 如果我只创建第二个参考,它就可以工作。

但是当我尝试构建两个引用时,它失败了。

2 个答案:

答案 0 :(得分:1)

我可以在UCanAccess 4.0.3下重现该问题。 HSQLDB和Jackcess都没有在同一个两个表之间创建两个独立的FK关系的问题,所以看起来它可能是UCanAccess中的一个错误。我将向UCanAccess开发团队报告此问题,并以任何新闻更新此答案。

更新

此问题的修复程序已经实施,并将包含在UCanAccess 4.0.4版本中。

答案 1 :(得分:0)

我认为它不起作用,因为你有" ON DELETE CASCADE"对于你的外键。