提问人:markzzz 提问时间:11/22/2010 最后编辑:Communitymarkzzz 更新时间:1/29/2020 访问量:181806
MySQL 和 Java - 获取最后插入值 (JDBC) 的 ID [重复]
MySQL & Java - Get id of the last inserted value (JDBC) [duplicate]
问:
可能的重复:
如何在JDBC中获取插入ID?
嗨,我正在使用 JDBC 通过 Java 连接数据库。
现在,我做了一些插入查询,我需要获取最后插入值的 id(所以,在 )。stmt.executeUpdate
我不需要类似的东西,因为我可能有并发问题。SELECT id FROM table ORDER BY id DESC LIMIT 1
我只需要检索与上次插入关联的 id(关于我的 Statement 实例)。
我试过这个,但似乎它不适用于JDBC:
public Integer insertQueryGetId(String query) {
Integer numero=0;
Integer risultato=-1;
try {
Statement stmt = db.createStatement();
numero = stmt.executeUpdate(query);
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
risultato=rs.getInt(1);
}
rs.close();
stmt.close();
} catch (Exception e) {
e.printStackTrace();
errore = e.getMessage();
risultato=-1;
}
return risultato;
}
事实上,每一次,我都会得到risultato = -1
java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
如何解决此问题?感谢 Stackoverflow People :)
答:
183赞
Sean Bright
11/22/2010
#1
你不会改变吗?
numero = stmt.executeUpdate(query);
自:
numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
查看 JDBC Statement
接口的文档。
更新:显然,这个答案有很多困惑,但我的猜测是,困惑的人并没有在所问问题的上下文中阅读它。如果您采用 OP 在他的问题中提供的代码并替换我建议的单行(第 6 行),一切都会起作用。该变量完全无关紧要,设置后永远不会读取其值。numero
评论
1赞
markzzz
11/22/2010
你真棒!!!呵呵,我不太能读懂这个警告消息:)
1赞
bizzr3
10/8/2014
+1 为RETURN_GENERATED_KEYS
0赞
Pierre
3/29/2015
是的,这真的行不通。尝试插入几条记录,删除所有记录(不截断),然后查看是否检索了正确的 ID ;)
3赞
Sean Bright
6/17/2015
@wu-lee 返回值无关紧要(在 OP 的问题中,未使用)。您会注意到,他遍历了返回的 .如果您有其他问题,请告诉我。numero
ResultSet
Statement.getGeneratedKeys()
2赞
slodeveloper
4/9/2016
这是错误的......方法 executeUpdate 返回:(1) SQL 数据操作语言 (DML) 语句的行计数,或 (2) 0(不返回任何内容的 SQL 语句)。您必须创建结果集并获取最后一个 ID,如下所示: rs = st.getGeneratedKeys();if(rs.next()) { insertId = rs.getInt(1);
146赞
Buhake Sindi
11/22/2010
#2
或者,您可以执行以下操作:
Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
risultato=rs.getString(1);
}
但是,请将 Sean Bright 的答案用于您的情况。
评论
0赞
Ferhat KOÇER
1/29/2020
如果您的表键有任何分区,则此代码将出错。我的建议使用 risultato=rs.getString(1);
评论