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

mid*_*nhk 26 java database derby

我是新手,apache derby似乎无法开展工作

    CREATE TABLE IF NOT EXISTS table1 ...
Run Code Online (Sandbox Code Playgroud)

如可以在实现MySql等我收到'Syntax error: Encountered "NOT" at line 1, column 17.'的时候我尝试运行这个SQL在我的发言Java程序.

我查看了Derby Db Create Statements的文档页面,但找不到这样的替代方案.

Aar*_*lla 25

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

完整的错误代码列表可以在这里 找到,但我找不到Table <value> already exists; 它可能是X0Y68.你需要的代码是X0Y32.

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

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

} catch( SQLException e ) {
    if( DerbyHelper.tableAlreadyExists( e ) ) {
        return; // That's OK
    }
    throw e;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您尝试执行相反的操作,则删除表(如果存在),要捕获的错误代码是“42Y55”。 (2认同)

oer*_*ers 12

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());
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • +1用于API的语义使用.迄今为止最好的方法恕我直言 谢谢你们. (2认同)

Ank*_*ary 5

Derby 数据库不支持您正在执行的查询。相反,如果您知道表的名称,您可以很容易地找到表是否存在。

public boolean isTableExist(String sTablename) throws SQLException{
    if(connection!=null)
    {
        DatabaseMetaData dbmd = connection.getMetaData();
        ResultSet rs = dbmd.getTables(null, null, sTablename.toUpperCase(),null);
        if(rs.next())
        {
            System.out.println("Table "+rs.getString("TABLE_NAME")+"already exists !!");
        }
        else
        {
            System.out.println("Write your create table function here !!!");
        }
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,要以大写形式指定表名称,否则您将无法在元数据中找到表名称。


Adh*_*mal 5

检查表是否存在:

Connection con = DriverManager.getConnection(url);
ResultSet res = con.getMetaData().getTables(null, Schema_Name, table_name.toUpperCase(), null);//Default schema name is "APP"
if(res.next())
{
    //do some thing;
}else{
    JOptionPane.showMessageDialog(null, table_name +" not exist");
}
Run Code Online (Sandbox Code Playgroud)

显示所有表名称:

    Connection con = DriverManager.getConnection(url);
    ResultSet res = con.getMetaData().getTables(null, Schema_Name, "%", null);//Default schema name is "APP"
    while(res.next())
    {
        JOptionPane.showMessageDialog(null, res.getString(3) + " is exist");//Show table name
    }else{
        JOptionPane.showMessageDialog(null, table_name +" not exist");
    }
Run Code Online (Sandbox Code Playgroud)