#java #mysql #sql
#java #mysql #sql
Вопрос:
У меня есть таблица, в которой потенциально может быть от 200 до 300 тысяч строк.
Мне нужно проверить, существует ли первичный ключ в таблице.
Вот что у меня есть до сих пор:
public boolean checkIfKeyExists(String userkey) {
try {
connection = getSQLConnection();
PreparedStatement ps = connection.prepareStatement("SELECT userkey FROM " keytable " WHERE userkey = ?");
ps.setString(1, userkey);
ResultSet rs = ps.executeQuery();
boolean set = false;
while(rs.next()){
set = true;
}
close(ps,rs);
return set;
} catch (SQLException ex) {
Error.execute(plugin, ex);
}
return false;
}
Необходимость использования результирующего набора и установки логического значения, которое кажется слишком длинным для простой проверки ключа, вы знаете?
Каков самый простой способ сделать это?
Комментарии:
1. Если это первичный ключ, и вы проверяете равенство, вы должны получить максимум одну строку. Операция не должна быть слишком длительной.
2. @fabian ты фабиан из codecanyon?
Ответ №1:
Я не вижу способа обойти использование результирующего набора, но вы могли бы обойти необходимость установки логического значения, просто выполнив
return ps.executeQuery().next();
а затем закройте свой оператор и resultset в finally
блоке.
Комментарии:
1. это возвращает true / false независимо от того, есть результат или нет?
2. @ThatGuy343 Не соответствует документу . И в вашей первоначальной реализации вы также основывались на результате
next()
установки вашего флага.3. Определенно более эффективный способ сделать это.
Ответ №2:
Используя ваши переменные, вы можете иметь
set = rs.next();
Alsi в части SQL, которую вы можете иметь SELECT 1 ...
, будет работать немного быстрее.
Комментарии:
1. итак, если я добавлю «ВЫБРАТЬ 1 ИЗ таблицы ключей», это то же самое, что «ВЫБРАТЬ пользовательский ключ»?
2. Содержимое результирующего набора, очевидно, будет другим, но количество строк одинаковым.