SQL 语句 returns 一个空的结果集 table

SQL statement returns a resultset on an empty table

        String sql = "Select MAX(ORDERLINEID) From ORDERLINESTABLE";
        ResultSet rst;
        rst = stmt.executeQuery(sql);

        if(rst.next())
        {
            next = rst.getInt("ORDERLINEID");
            next++;
        }

我的数据库中有一个名为 ORDERLINESTABLE 的 table 当前是空的。我有 运行 上面的代码,目的是获取存储在 ORDERLINEID 列中的最大整数,允许我在向数据库添加项目时增加它。

我希望这个查询 return 什么都没有,因为 table 是空的但是在调试时我注意到 return 对 rst.next() 的搜索是正确的方法。

有人知道为什么会这样吗?我查看了 resultset.next() 文档,据我所知,它应该 return false.

如有疑问,请查看您的数据。这是来自任何数据库引擎的示例查询。

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 安全得多。

在多用户环境中错误 ID 的情况很多:

  • 第一SELECT
  • 秒SELECT
  • 新 ID 的第二个增量
  • 新 ID 的第一次增量
  • 先插入
  • 第二次插入