【问题标题】:SQL statement returns a resultset on an empty tableSQL 语句返回空表的结果集
【发布时间】:2018-01-16 17:33:31
【问题描述】:
        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。

【问题讨论】:

  • 至于“为什么”,这是一个基本的SQL行为,和关系代数、关系演算、聚合函数等基础学术理论有关,这里有点参考:www-cs-students.stanford.edu/~wlam/compsci/sqlnulls
  • 感谢那个人,只是收藏了那个链接。不会假装我理解所有这些,但足以让我将来可以使用它:)

标签: java mysql sql derby


【解决方案1】:

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

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

它会产生

maxValue
Null

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

【讨论】:

  • 谢谢,我运行了查询,你 100% 正确,它返回一个空值。仍然不确定为什么,但我可以使用它。非常感谢您的回答!
【解决方案2】:

最好在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 的情况很多:

  • 第一个选择
  • 第二次选择
  • 新 ID 的第二个增量
  • 新 ID 的第一个增量
  • 第一次插入
  • 第二次插入

【讨论】:

  • 我很欣赏这些信息 - 我正在制作的程序是一个简单的用于在我的大学进行评估的程序,一次只能有一个用户登录,但我将来肯定会使用这些信息再次感谢!
  • 感谢您的澄清;赞赏
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 2016-01-16
  • 2014-08-17
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
相关资源
最近更新 更多