繁体   English   中英

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

[英]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的表,该表当前为空。 我运行上面的代码的目的是要获取存储在ORDERLINEID列中的最高整数,允许我在向数据库添加项目时对其进行递增。

我希望此查询什么都不会返回,因为表为空,但是在调试时,我注意到rst.next()方法的搜索返回true。

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

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

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

它会产生

maxValue
Null

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

最好在INSERT语句之后获取数据库填充的ORDERLINEID。 使列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
  • 新ID的第二个增量
  • 新ID的第一个增量
  • 第一次插入
  • 第二次插入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM