Как проверить, существует ли индекс уже в таблице?

#java #jdbc

Вопрос:

У меня есть этот метод, чтобы проверить, существует ли индекс уже в таблице. Запрос возвращает таблицу, подобную этой введите описание изображения здесь

Как я могу проверить, есть ли в таблице уже строка в столбце Key_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;
    }
 

Комментарии:

1. Как бы вы сделали это вручную?

2. @PM77-1 Я бы просмотрел все строки таблицы и проверил, равно ли значение Key_name имени индекса

3. Знаете ли вы, как извлечь значение столбца из результирующего набора ?

4. @PM77-1 нет,я не знаю

Ответ №1:

Одним из способов было бы просмотреть набор результатов. Вы можете просмотреть все строки таблицы и проверить, равно ли значение Key_name имени индекса.

 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;
}
 

Комментарии:

1. По какой-то причине я подумал, что имя метода было hasNext()

2. почему финал во всех областях?

3. На мой взгляд, это просто хорошая практика. Решает ли это вашу проблему?

Ответ №2:

Не используйте ШОУ. Это предназначено для отображения простых результатов и не подходит для каких-либо решений или расчетов.

Количество ИСПОЛЬЗОВАНИЙ:

 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 таким образом. Кроме того, обратите внимание, что набор результатов является ресурсом и должен быть закрыт либо в режиме «попробуй-поймай-наконец», либо (предпочтительно) «попробуй-с-ресурсами», как показано здесь.

И в зависимости от того, что вы делаете, может быть более полезно просто вернуть индекс:

 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_index, вы можете использовать EXISTS, чтобы сделать все это в одной транзакции.

Комментарии:

1. почему оператор execute находится внутри () ?

2. Я получил эту ошибку Error Code: 1054. Unknown column 'Key_name' in 'field list' в первом запросе