MySQL 和 Java - 获取最后插入值 (JDBC) 的 ID [重复]

MySQL & Java - Get id of the last inserted value (JDBC) [duplicate]

提问人:markzzz 提问时间:11/22/2010 最后编辑:Communitymarkzzz 更新时间:1/29/2020 访问量:181806

问:

这个问题在这里已经有答案了:
13年前关闭。

可能的重复:
如何在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 = -1java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

如何解决此问题?感谢 Stackoverflow People :)

java mysql jdbc

评论

0赞 Buhake Sindi 11/22/2010
看我的问题:stackoverflow.com/questions/4224228/......
0赞 BalusC 11/22/2010
如何在JDBC中获取插入ID?

答:

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 的问题中,未使用)。您会注意到,他遍历了返回的 .如果您有其他问题,请告诉我。numeroResultSetStatement.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);