DatabaseMetaData#getTables无法在Derby中找到现有表

时间:2017-11-10 14:21:57

标签: java database jdbc 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'.看起来init()方法中的ResultSet rs为空。但是,在调用SELECT * FROM mytable之后,数据就存在并且它们是正确的。

我该如何解决这个问题?哪里可以问题?

1 个答案:

答案 0 :(得分:2)

Derby的MediaMuxer.stop()实现似乎区分大小写,Derby似乎也强制您的表名称为大写。

  

java.sql.SQLException:表/视图' MYTABLE'已经存在于Schema' APP'。

所以,你可能需要使用像

这样的东西
.getTables

以获得匹配。