SQL语句在空表上返回结果集

时间:2018-01-16 17:33:32

标签: java mysql sql derby

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

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

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

我希望这个查询不返回任何内容,因为表是空的但是在调试时我发现搜索对于rst.next()方法返回true。

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

2 个答案:

答案 0 :(得分:2)

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

If(selectCoffee){
//Code here if  coffee selected
}

它会产生

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

换句话说,您的查询返回一条值为null的记录。

答案 1 :(得分:1)

在INSERT语句之后获取由数据库填充的ORDERLINEID要好得多。创建INT AUTOINCREMENT类型的ORDERLINEID列。

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的方案很多:

  • 首先选择
  • 第二次选择
  • 新ID的第二个增量
  • 新ID的第一次增量
  • 首先INSERT
  • 第二次INSERT