【问题标题】:MySQL & Java - Get id of the last inserted value (JDBC) [duplicate]MySQL & Java - 获取最后插入值的 id (JDBC) [重复]
【发布时间】:2011-05-13 21:31:42
【问题描述】:

可能重复:
How to get the insert ID in JDBC?

您好,我正在使用 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 人 :)

【问题讨论】:

标签: java mysql jdbc


【解决方案1】:

你会不会改变:

numero = stmt.executeUpdate(query);

到:

numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

查看 JDBC Statement 接口的文档。

更新:显然对这个答案有很多困惑,但我的猜测是,困惑的人并没有在所问问题的上下文中阅读它。如果您采用 OP 在他的问题中提供的代码并替换我建议的单行(第 6 行),那么一切都会正常工作。 numero 变量完全不相关,它的值在设置后永远不会被读取。

【讨论】:

  • 你摇滚!!!呵呵,我看不懂这个警告信息:)
  • RETURN_GENERATED_KEYS+1
  • 是的,这真的行不通。尝试插入几条记录,删除所有记录(不截断)并查看是否检索到正确的 ID ;)
  • @wu-lee 返回值无关紧要(在 OP 的问题中,numero 未使用)。你会注意到他遍历了Statement.getGeneratedKeys() 返回的ResultSet。如果您还有其他问题,请告诉我。
  • 那是错误的... 方法 executeUpdate 返回:(1) SQL 数据操作语言 (DML) 语句的行数或 (2) 0 用于不返回任何内容的 SQL 语句。您必须创建结果集并获取最后一个 ID,如下所示: rs = st.getGeneratedKeys(); if(rs.next()) { insertId = rs.getInt(1); }
【解决方案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 的答案。

【讨论】:

  • 非常感谢!我不知道这可以使用 JDBC,在表中插入多行时,我一直试图获取所有生成的键。我真的需要那些自动递增的密钥,而LAST_INSERT_ID(); + 1 我并不完全信任,无论如何这应该是安全的!
  • 我知道我迟到了 2 年,但谢谢你 :) 这行得通:D
  • 谢谢,这是唯一可行的方法! :)
  • 非常好,另外 1 用于解释如何实际获取密钥...
  • 这个对我有用,你拯救了我的一天。
猜你喜欢
  • 2016-06-05
  • 2014-01-20
  • 2011-06-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 2017-10-14
  • 2019-01-16
  • 2011-08-07
相关资源
最近更新 更多