有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    Derby对.getTables的实现似乎是区分大小写的,Derby似乎还强制表名为大写

    java.sql.SQLException: Table/View 'MYTABLE' already exists in Schema 'APP'.

    因此,您可能需要使用以下内容

    ResultSet rs = metaData.getTables(null, null, "mytable".toUpperCase(), null);
    

    为了得到一个匹配