Оператор SQL возвращает набор результатов для пустой таблицы

0
        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.

  • 0
    Что касается «почему», это фундаментальное поведение SQL, и оно связано с базовой академической теорией реляционной алгебры, реляционного исчисления и агрегатных функций и т. Д. Вот немного справки: www-cs-Students.stanford .edu / ~ wlam / compsci / sqlnulls
  • 1
    Спасибо за этого человека, просто одобрил эту ссылку. Не буду притворяться, что я все это понимаю, но достаточно, чтобы я мог использовать это в будущем :)
Теги:
derby

2 ответа

2
Лучший ответ

Когда вы сомневаетесь, посмотрите на свои данные. Вот пример запроса из любого движка db.

select max(field) maxValue
from table
where 1=3

Это даст

maxValue
Null

Другими словами, ваш запрос возвращает одну запись со значением null.

  • 0
    Спасибо, я выполнил запрос, и вы были на 100% правы, он возвращает ноль. До сих пор не уверен, почему, но я могу работать с этим. Очень ценю ваш ответ!
1

Гораздо лучше получить 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 после или раньше, в многопользовательской среде.

Сценарии неправильных идентификаторов многочисленны в многопользовательской среде:

  • сначала SELECT
  • второй SELECT
  • второе приращение для нового идентификатора
  • первый приращение для нового идентификатора
  • первый INSERT
  • второй INSERT
  • 0
    Я ценю информацию - программа, которую я делаю, является простой для оценки в моем колледже, и в нее будет входить только один пользователь, но я обязательно буду использовать эту информацию в будущем, поэтому еще раз спасибо!
  • 0
    Спасибо за разъяснения; оценили

Ещё вопросы

Сообщество Overcoder
Наверх
Меню