String sql = "Select MAX(ORDERLINEID) From ORDERLINESTABLE";
ResultSet rst;
rst = stmt.executeQuery(sql);
if(rst.next())
{
next = rst.getInt("ORDERLINEID");
next++;
}
У меня есть таблица под названием ORDERLINESTABLE в моей базе данных, которая в настоящее время пуста. Я запустил вышеуказанный код с целью получить наивысшее целое число, сохраненное в столбце ORDERLINEID, что позволяет мне увеличивать его при добавлении элементов в базу данных.
Я ожидал, что этот запрос ничего не вернет, поскольку таблица пуста, но при отладке я заметил, что поиск возвращает true для метода rst.next().
Кто-нибудь знает, почему это было бы? Я просмотрел документацию resultset.next(), и, насколько я вижу, он должен возвращать false.
Когда вы сомневаетесь, посмотрите на свои данные. Вот пример запроса из любого движка db.
select max(field) maxValue
from table
where 1=3
Это даст
maxValue
Null
Другими словами, ваш запрос возвращает одну запись со значением null.
Гораздо лучше получить ORDERLINEID, заполненный базой данных после инструкции INSERT. Сделайте столбец ORDERLINEID типа INT AUTOINCREMENT.
String sql = "INSERT INTO ORDERLINESTABLE(xxx, yyy) VALUES (?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
stmt.setString(1, xxx);
stmt.setInt(2, yyy);
int updateCount = stmt.executeUpdate(); // 1
try (ResultSet id = stmt.getGeneratedKeys()) {
if (id.next()) { // 'if' as just 1 row inserted.
int orderLineId = id.getInt(1); // 1 key per row.
}
}
}
Java имеет независимый от базы данных способ получения сгенерированных ключей INSERT. Это намного безопаснее, чем принятие MAX после или раньше, в многопользовательской среде.
Сценарии неправильных идентификаторов многочисленны в многопользовательской среде: