【发布时间】:2011-06-21 03:40:53
【问题描述】:
我正在使用 JDBC 连接到 Java DB 数据库,并且想要检索插入的最后一条记录的 id(自动递增)。
我看到这是一个常见问题,但我看到 solutions 使用例如 MS SQL Server,Java DB 的等价物是什么?
【问题讨论】:
我正在使用 JDBC 连接到 Java DB 数据库,并且想要检索插入的最后一条记录的 id(自动递增)。
我看到这是一个常见问题,但我看到 solutions 使用例如 MS SQL Server,Java DB 的等价物是什么?
【问题讨论】:
对于那些在获取生成的自动增量 ID 时遇到问题的人,就像我以前在 Java Derby 中一样,我的回答可能会有所帮助。
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
}
从here复制的答案
【讨论】:
无需为此使用特定于 DBMS 的 SQL。
这就是getGeneratedKeys() 的用途。
当preparing your statement 传递自动生成列的名称时,您可以使用 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);
【讨论】:
getGeneratedKeys()?
PreparedStatement.RETURN_GENERATED_KEYS 而不是字符串数组作为 PreparedStatement 中的第二个参数解决了问题。 (如果有人想知道,我很确定我的问题不是拼写错误)。
new String[] { "ID"} 不是 new String[] { "id"}
您可以使用 IDENTITY_VAL_LOCAL 函数获得所需的内容。 (Derby Reference)
此函数应该返回“最近为连接分配的标识列值,其中分配是由于使用 VALUES 子句的单行 INSERT 语句而发生的。”
值得注意的是,该函数将返回 DECIMAL(31,0),而不管对应标识列的实际数据类型如何。
此外,这仅适用于包含 VALUES 子句的单行插入。
【讨论】: