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

Posted

技术标签:

【中文标题】如何通过 UCanAccess 创建一个包含两个外键引用到另一个表的表?【英文标题】:How can I create a Table with two Foreign Key References to one other Table via UCanAccess? 【发布时间】:2018-03-07 19:52:24 【问题描述】:

直接在 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");

如果我只创建第一个引用,它就可以工作。 如果我只创建第二个引用,它就可以工作。

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

【问题讨论】:

【参考方案1】:

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

更新:

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

【讨论】:

我已经安装了固定的 UCanAccess 4.0.4 版本,它适用于我给定的示例。但是在我的应用程序中,我有“添加外键”命令,这些命令具有非显式名称的约束。在这种情况下,Bug 仍然存在。为了快速修复,我更改了我的应用程序代码。现在我只使用命名约束。但我认为修复 UCanAccess 会更好,它也可以处理没有名称的约束。【参考方案2】:

我认为它不会起作用,因为您的两个外键都有“ON DELETE CASCADE”。

【讨论】:

不,这似乎不是问题所在。 UCanAccess 使用 HSQLDB 作为其后备数据库,并且 HSQLDB 能够使用 ON DELETE CASCADE 创建这两种关系。

以上是关于如何通过 UCanAccess 创建一个包含两个外键引用到另一个表的表?的主要内容,如果未能解决你的问题,请参考以下文章

使用 UCanAccess 创建表后,ms 访问未强制执行非空约束

通过 UCanAccess 在 Eclipse 中“从表中生成实体”(MS Access)

如何使用 UCanAccess 从 Java 将两个字符串插入我的 Access 数据库?

如何通过 UCanAccess 访问远程机器上的数据库文件?

如何使用 UCanAccess 在两列上创建具有唯一约束的表?

如何通过 SQL 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?