当前位置: 首页 > 面试题库 >

有没有办法从准备好的语句中检索自动增量ID

唐啸
2023-03-14
问题内容

使用带有预准备语句的Java查询时,是否有一种方法可以从数据库查询中检索自动生成的键。

例如,我知道AutoGeneratedKeys可以按以下方式工作。

stmt = conn.createStatement();

stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
}

然而。如果我想插入一个准备好的语句该怎么办。

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql);

//this is an error
stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    //this is an error since the above is an error
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
}

有没有办法做到这一点,我不知道。从javadoc看来,PreparedStatements无法返回自动生成的ID。


问题答案:

是。看这里。第7.1.9节。将您的代码更改为:

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);


stmt.executeUpdate();
if(returnLastInsertId) {
   ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
   auto_id = rs.getInt(1);
}


 类似资料:
  • 我已经回顾了类似的问题“查看并清除Postgres缓存/缓冲区?,但所有的答案都集中在数据缓冲区上,并且自2010年以来,Postgresql发生了很大变化。 与那个问题的OP不同,我不是在计算性能时寻找一致的行为,而是在数据库随时间变化时寻找自适应的行为。 在我的应用程序中,在作业执行开始时,工作表中的行为空。查询运行非常快,但是随着时间的推移,性能下降,因为准备好的语句没有使用理想的访问路径(

  • 我正在寻找一种用Java转义MySQL查询的字符串的方法。 但等一下,在你们中的一些人直接下结论说“事先准备好的声明”之前,我想再解释一下。

  • 问题内容: 我总是发现很难编写MySQLi预备语句,因为许多函数的工作方式与旧方法不同。现在我面临一个问题。 问题答案: 您正在尝试通过以下方式获取结果 事实并非如此。因为execute将仅返回布尔值。 做喜欢的。

  • 问题内容: 我想在 同一批中 发送 两个不同的准备好的语句 。 目前,正如您在注释行中看到的那样,我将一分为二,并且可以正常工作,但这不是这里的主要目标。谁能告诉我用什么代替这些评论,以使此功能正常工作? 问题答案: 您不能在一个批处理中执行两个不同的语句。正如@dan所提到的,您可以-并且 必须 -在单个事务中完成它们。 另一种选择是使用存储过程,该存储过程可以在一次往返服务器的过程中完成所有操

  • 问题内容: 我正在尝试将数据插入为主数据ID,该数据在MySQL数据库中具有一个字母数字值和两个数字值。该数据将自动递增生成数字,但字母数字值将是固定的。像D1,D2 .... D54,D55,D56等。这里,“ D”始终相同,但是数字将自动递增。有什么办法吗? 问题答案: 首先, 不建议这样做 ,就像其他评论一样,您可以动态生成此id值。 但是,尽管如此,至少有两种方法可以实现: 或多或少可靠的