Я пытаюсь создать отношение мастер / подробности между двумя таблицами в MS Access с помощью драйвера JDBC UCanAccess.
Обе таблицы созданы, но отношение внешнего ключа завершается неудачно с " Отсутствует столбец вотношение (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. Что я делаю не так?
Я пытался использовать разные алфавитные и числовые типы данных, с указанием размеров и без них, но безрезультатно.
Я также с интересом прочитал "Отсутствуетстолбцы во взаимосвязи »при создании таблицы и попробовал пример после изменения внешних ключей на LONG. Это тоже не сработало.
Я использую UCanAccess 4.0.4, MS Access (формат файла 2007-2016), OpenJDK 13 + 33 и OpenJFX 13.0.1, работающий в Apache NetBeans 11.1 в Windows10.
Если это помогает, сообщение 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.healthmarcessilders.toRelationship (RelationshipBuilder.java:192) по адресу net.ucanaccess.converters.Persist2Jet.createForeignKey (Persist2Jet.java:807) по адресу net.ucanaccess.converters.Persist2Jet.createForeignKeys (Persist2Jet.conv. 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.AbstractExjtete (): 273) в net.ucanaccess.jdbc.Execute.execute (Execute.java:44) в net.ucanaccess.jdbc.UcanaccessStatement.execute (UcanaccessStatement.java:157) в replicatesqliteschema.ReplicateSQLiteSchema.createava1chema.jpgпо адресу replicatesqliteschema.ReplicateSQLiteSchema.start (ReplicateSQLiteSchema.java:271) по адресу javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846.ics.javafx.xf. 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. 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)