我正在尝试使用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)