我正在尝试使用JDBC来更新表。该表由两个属性A和B组成。主键是A和B的复合键。它看起来像这样:
A | B
------
1 | 0
2 | 0
3 | 0
3 | 1
现在我希望能够根据我选择的A属性向此表添加新条目。它应该添加另一个,将其递增1.例如,如果我想“更新”3,表格看起来像这样:
A | B
------
1 | 0
2 | 0
3 | 0
3 | 1
3 | 2
为此,我使用预准备语句来获取任何A的最大B值。
PreparedStatement max = connection.prepareStatement("SELECT max(B) as B FROM Table WHERE A = ?");
max.setInt(1, x);
ResultSet rsMax = max.executeQuery();
if(rsMax.next()) {
/* do stuff */
}
如果A值与x具有相同的值,那么效果非常好。 但是,当x是表中未包含的值时,我会出现异常,例如10。
我正在使用H2,当我尝试在Web界面中输入与准备好的语句(当然正确的数字)相同的查询时,结果我得到null,这就是我的假设如果在表中没有具有此值的A属性,则获取。但是,我的程序仍然进入if块,我不知道为什么。我认为如果结果集为空,这不应该发生?
我可以尝试从结果集中获取值,但是如果我想得到一个整数,我可以理解得到0.现在我可以通过没有任何A条目使用0来解决这个问题,但我怀疑这是正确的方法。
任何帮助都将不胜感激。
答案 0 :(得分:0)
首先警告如果可能有更多并发连接到数据库,请不要使用此方法。
原因很简单,更多会话将读取最大值增加它并插入重复项。另一方面如果每次只有一个连接,这是一种有效的方法。
问题是MAX函数总是返回一条记录,因此测试并不意味着完整。
检查必须检查返回的值是NULL还是NOT NULL。为此,定义了wasNull方法 - 参见下面的剪辑:
if(rs.next()) {
ResultSet idx = rs.getInt(1)
if (rs.wasNull()) { idx = 0;} // no record found - use init value
else {idx =+ 1;} // record found - increase the value
}