UCanAccess-如何在MS Access中创建VARCHAR外键?出现“关系中缺少列”错误

时间:2019-11-05 09:28:28

标签: java sql ms-access jdbc ucanaccess

我正在尝试使用UCanAccess JDBC驱动程序在MS Access中的两个表之间创建主/详细关系。

两个表都被创建,但是外键关系失败,并显示为“ 关系中缺少列(Rel = master_table [[]]-> detail_table [[]])”。

这是我的测试代码:

try  {

    Connection connection = DriverManager.getConnection(dbURL);
    Statement statement = connection.createStatement();

    statement.execute("CREATE TABLE master_table ("
                        + "masterPK VARCHAR(32) PRIMARY KEY NOT NULL"
                        + ");");

    statement.execute("CREATE TABLE detail_table ("
                        + "detailPK LONG PRIMARY KEY NOT NULL,"
                        + "detailFK VARCHAR(32) REFERENCES master_table(masterPK) NOT NULL"
                        + ");");

} catch (SQLException ex) {
    ex.getMessage();
}

当我在Access中而不是通过UCanAccess发出语句时,这些语句可以正常工作。我在做什么错了?

我尝试使用不同的字母和数字数据类型,无论是否指定大小,都无济于事。

我也很感兴趣地阅读了"Missing columns in relationship" when creating table,并在将外键更改为LONG之后尝试了该示例。那也不起作用。

我正在使用Windows 10上的Apache NetBeans 11.1中运行的UCanAccess 4.0.4,MS Access(2007-2016文件格式),OpenJDK 13 + 33和OpenJFX 13.0.1。

如果有帮助,则SQLException消息如下:

  

java.lang.IllegalArgumentException:缺少列   关系(Rel = master_table [[]]-> detail_table [[]])在   com.healthmarketscience.jackcess.impl.RelationshipCreator.validate(RelationshipCreator.java:183)     在   com.healthmarketscience.jackcess.impl.RelationshipCreator.createRelationship(RelationshipCreator.java:98)     在   com.healthmarketscience.jackcess.RelationshipBuilder.toRelationship(RelationshipBuilder.java:192)     在   net.ucanaccess.converters.Persist2Jet.createForeignKey(Persist2Jet.java:807)     在   net.ucanaccess.converters.Persist2Jet.createForeignKeys(Persist2Jet.java:761)     在   net.ucanaccess.converters.Persist2Jet.createTable(Persist2Jet.java:481)     在   net.ucanaccess.commands.CreateTableCommand.persist(CreateTableCommand.java:100)     在   net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:323)     在   net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:205)     在   net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:273)     在net.ucanaccess.jdbc.Execute.execute(Execute.java:44)在   net.ucanaccess.jdbc.UcanaccessStatement.execute(UcanaccessStatement.java:157)     在   复制sqlitechema.ReplicateSQLiteSchema.createContent(ReplicateSQLiteSchema.java:190)     在   复制SQLitechema.ReplicateSQLiteSchema.start(ReplicateSQLiteSchema.java:271)     在   javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)     在   javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)     在   javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)     在   java.base / java.security.AccessController.doPrivileged(AccessController.java:391)     在   javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)     在   javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)     在   javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(本机   方法)   javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)     在java.base / java.lang.Thread.run(Thread.java:830)

0 个答案:

没有答案