检索刚插入到Java DB(Derby)数据库中的记录的ID

12

我正在使用JDBC连接Java DB数据库,并希望检索最后插入的记录的id(它是自动递增的)。

我发现这是一个常见的问题,但我看到解决方案,例如使用MS SQL Server,那么在Java DB中等价的是什么?

3个回答

26
不需要使用特定于DBMS的SQL语句来实现此操作。
这就是getGeneratedKeys()的作用。
准备您的语句时,您传递自动生成列的名称,然后可以使用getGeneratedKeys()检索它们。
PreparedStatement pstmt = connection.prepareStatement(
     "insert into some_table (col1, col2, ..) values (....)", 
      new String[] { "ID_COLUMN"} ); 

pstmt.executeUpdate();

ResultSet rs = pstmt.getGeneratedKeys(); // will return the ID in ID_COLUMN

请注意,在Derby和许多其他DBMS中,此处列名是区分大小写的。
new String[] { "ID_COLUMN"}new String[] { "id_column"} 不同。

或者你也可以使用:

connection.prepareStatement("INSERT ...", PreparedStatement.RETURN_GENERATED_KEYS);

我只是想确认一下,虽然我有99%的把握,但如果在插入和使用getGeneratedKeys()获取列值之间执行了多个插入语句,它是否仍会返回预期的自动生成的列值? - Akash Agarwal
对我来说不起作用,而且看起来JDBC不完全支持Derby的identity列。我收到一个异常,说我的表没有名为'id'的自动生成列,但它显然有 :) - Alex
1
无论如何,我通过在PreparedStatement中使用PreparedStatement.RETURN_GENERATED_KEYS而不是字符串数组作为第二个参数来解决了问题。(如果有人想知道,我非常确定我的问题不是打字错误)。 - Alex
1
@Alex:我可以百分之百确定以上代码适用于Apache Derby。你提供的链接是一个处理ActiveJDBC的团体,它是建立在JDBC之上的ORM(“Obfuscated Relational Model”)框架。 “JDBC”本身并不支持任何东西——它只是需要由JDBC驱动程序的供应商实现的规范。这与Derby提供的JDBC驱动程序无关。如果那个框架不能与Derby一起使用,那既不是“JDBC”的错,也不是Derby的错。也许您没有正确指定列,例如new String[] { "ID"}new String[] { "id"}不同。 - user330315
哦,我懂了,感谢您的澄清。是的,显然列名称是区分大小写的,我以为它们可以双向工作,再次感谢@a_horse_with_no_name。我仍然会留下我的评论,只是为了提供一种更普遍的获取列的方式。 - Alex

3
您可以使用IDENTITY_VAL_LOCAL函数来获取所需内容。(Derby参考文档
该函数应返回“由于单个行INSERT语句使用VALUES子句而导致的连接中标识列的最近分配值。”
值得注意的是,无论相应的标识列的实际数据类型如何,此函数将返回DECIMAL(31,0)。
此外,这仅适用于包含VALUES子句的单行插入。

1

对于那些像我一样在Java Derby中遇到获取生成的自增ID问题的人,我的答案可能会有所帮助。

stmt.executeUpdate("INSERT INTO xx(Name) VALUES ('Joe')", Statement.RETURN_GENERATED_KEYS);

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
  int autoKey = rs.getInt(1); //this is the auto-generated key for your use
} 

答案从这里复制而来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接