java DatabaseMetaData#getTables在Derby中找不到现有表
我正在用Java连接Derby数据库:
public EmbeddedDerbyDataConnection(String name) throws SQLException {
EmbeddedDataSource dataSource = new EmbeddedDataSource();
dataSource.setDatabaseName(name);
dataSource.setCreateDatabase("create");
this.connection = dataSource.getConnection();
init();
}
连接似乎还可以。然后我调用init()
方法,如果表还不存在,它将创建该表,并用一些默认数据填充该表:
private void init() throws SQLException {
DatabaseMetaData metaData = this.connection.getMetaData();
ResultSet rs = metaData.getTables(null, null, "mytable", null);
if (rs.next()) {
System.out.println("Table already exists.");
} else {
Statement stmt = this.connection.createStatement();
String query = "CREATE TABLE mytable (...)";
stmt.executeUpdate(query);
stmt.close();
stmt = this.connection.createStatement();
query = "INSERT INTO mytable VALUES (...)";
stmt.executeUpdate(query);
stmt.close();
}
}
在第一次创建EmbeddedDerbyDataConnection的对象之后,看起来还可以。我通过SELECT * FROM mytable
测试了它,它返回了我放在这个表中的默认数据
在第二次调用之后,我得到:Exception in thread "main" java.sql.SQLException: Table/View 'mytable' already exists in Schema 'APP'.
方法中的ResultSet rs看起来是空的。但是,在调用SELECT * FROM mytable
之后,数据就在那里,并且是正确的
我怎样才能解决这个问题?问题出在哪里
# 1 楼答案
Derby对
.getTables
的实现似乎是区分大小写的,Derby似乎还强制表名为大写因此,您可能需要使用以下内容
为了得到一个匹配