如果表不存在,如何使用 Derby Db 创建表

2022-09-01 11:40:50

我是新手,我似乎不能工作apache derby

    CREATE TABLE IF NOT EXISTS table1 ...

如可以在等中实现。当我尝试在我的程序中运行此语句时,我得到了一个。MySql'Syntax error: Encountered "NOT" at line 1, column 17.'SQLJava

我在 Derby Db Create 语句的文档页面中进行了检查,但找不到这样的替代方案。


答案 1

创建表,捕获并检查 SQL 状态代码。SQLException

可以在此处找到错误代码的完整列表,但我找不到表<值>已经存在;它可能是X0Y68您需要的代码是 。X0Y32

只需运行一次代码并打印错误代码。不要忘记添加一个测试以确保代码正常工作;这样,您可以捕获错误代码中的更改(不应该发生...)。

在我的项目中,我通常使用静态方法添加一个帮助器类,以便我可以编写:

} catch( SQLException e ) {
    if( DerbyHelper.tableAlreadyExists( e ) ) {
        return; // That's OK
    }
    throw e;
}

另一种选择是对表运行 a 并检查状态代码(应该是 )。但这是您需要发送的第二个命令,它不会提供任何其他信息。SELECT42X05

更糟糕的是,它可能由于“表不存在”以外的其他原因而失败,因此“创建并忽略错误”是更好的IMO。


答案 2

Derby 不支持该 sql 语句。
在我的程序中,我将数据库中的所有表解析为一个集,并检查该表是否存在。喜欢这个:

  private Set<String> getDBTables(Connection targetDBConn) throws SQLException
  {
    Set<String> set = new HashSet<String>();
    DatabaseMetaData dbmeta = targetDBConn.getMetaData();
    readDBTable(set, dbmeta, "TABLE", null);
    readDBTable(set, dbmeta, "VIEW", null);
    return set;
  }

  private void readDBTable(Set<String> set, DatabaseMetaData dbmeta, String searchCriteria, String schema)
      throws SQLException
  {
    ResultSet rs = dbmeta.getTables(null, schema, null, new String[]
    { searchCriteria });
    while (rs.next())
    {
      set.add(rs.getString("TABLE_NAME").toLowerCase());
    }
  }

推荐