有 Java 编程相关的问题?

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

java如何检查表中是否已经存在索引?

我有这个方法来检查表中是否已经存在索引。 查询返回如下表 enter image description here

如何检查表的列键_name中是否已有行

 private boolean checkIndexExists(JdbcConnection connection,String indexName,String tableName) throws DatabaseException, SQLException {
        boolean exists=false;

        String searchStatement = "SHOW INDEXES FROM "+tableName;
        ResultSet columnsRs;
        Statement s = connection.createStatement();
        columnsRs = s.executeQuery(searchStatement);
        
        //CHECK IF THE INDEX ALREADY EXISTS

        return exists;
    }

共 (2) 个答案

  1. # 1 楼答案

    一种方法是查看结果集。您可以遍历表中的所有行,并检查Key_name的值是否等于indexName

    private boolean checkIndexExists(
        final JdbcConnection connection,
        final String indexName,
        final String tableName
    ) throws DatabaseException, SQLException {
        final String searchStatement = "SHOW INDEXES FROM " + tableName;
        final Statement statement = connection.createStatement();
        final ResultSet resultSet = statement.executeQuery(searchStatement);
    
        while (resultSet.next()) {
            if (indexName.equals(resultSet.getString("Key_name"))) {
                return true;
            }
        }
        return false;
    }
    
  2. # 2 楼答案

    不要使用SHOW。这是为了显示简单的结果,对于任何类型的决策或计算都不是很好

    使用计数:

    private boolean checkIndexExists(Connection connection,String indexName,String tableName) throws SQLException {
        String stmt = "SELECT COUNT(Key_name) FROM "+tableName+" WHERE Key_name='"+indexName+"'";
        try(ResultSet rs = connection.createStatement().executeQuery(stmt);){
            return rs.getInt("COUNT") > 0;
        }
    }
    

    如果没有可以计数的行,SQL COUNT将返回NULL,但是getInt将NULL解释为0,所以我们不需要通过这种方式检查NULL。另外,请注意,ResultSet是一个资源,应该在try-catch finally或(首选)try with resources中关闭,如图所示

    根据您正在做的事情,只返回索引可能更有用:

    private int getCurrentIndex(Connection connection,String indexName,String tableName) throws SQLException {
        String stmt = "SELECT MAX(Seq_in_index) FROM "+tableName+" WHERE Key_name='"+indexName+"'";
        try(ResultSet rs = connection.createStatement().executeQuery(stmt);){
            return rs.getInt("MAX");
        }
    }
    

    SQL中还有EXISTS关键字,但它通常用在更大的语句中,对于这个用例来说会更复杂。但是,如果您试图插入新行并相应地设置Seq_in_索引,那么可以使用EXISTS在一个事务中完成所有操作