我正试图从java
中的UPDATE语句中获取新的评级int userID = 99;
String sql = "UPDATE table SET rating=rating+1 WHERE user_REF="+userID;
statement.executeUpdate(sql);
我可以做另一个SELECT语句,但是在更新时没有更好的方法来检索值或行吗?
答案 0 :(得分:2)
简而言之,不,使用ANSI标准SQL无法做到这一点。
您有三种选择:
1)在两个查询中执行 - 更新,然后选择
2)创建一个执行更新的存储过程,然后返回select
3)使用特定于DB的扩展,例如PostgreSQL RETURNING子句
请注意,选项2)和3)是特定于数据库的。
答案 1 :(得分:1)
在MySQL中:
$query1 = 'UPDATE `table` SET rating = (@rating:= rating) + 1 WHERE id = 1';
$query2 = 'select @rating';
答案 2 :(得分:1)
感谢所有人的回复,我最终这样做了:
int userID = 99;
String sql = "SELECT id, rating FROM table WHERE user_REF="+userID;
ResultSet rs = statement.executeQuery(sql);
rs.first();
float oldRating = rs.getFloat("rating");
float newRating = oldRating +1;
rs.updateFloat("rating", newRating);
rs.updateRow();
return newRating;
那样它(或者至少看起来如此)只能找到一个查询正确的行,或者我错了吗?
答案 3 :(得分:0)
在PostgreSQL中有RETURNING子句
请参阅:http://www.postgresql.org/docs/8.3/interactive/sql-update.html
答案 4 :(得分:0)
请注意,大多数解决方案都依赖于数据库(无论您是否希望数据库独立于您的应用程序事务中)。
您可以尝试的另一种解决方案是编写一个过程并按如下方式执行
my_package.updateAndReturnRating(refId, cursor record).
当然,这可能/可能不会使解决方案本身变得复杂,但至少值得“评估”。