44

是否有跨数据库平台的方式来获取您刚刚插入的记录的主键?

我注意到这个答案说你可以通过调用来获取它SELECT LAST_INSERT_ID(),我认为你可以调用SELECT @@IDENTITY AS 'Identity';是否有一种通用的方法可以在 jdbc 中跨数据库执行此操作?

如果不是,你会如何建议我为一段可以访问 SQL Server、MySQL 和 Oracle 的代码实现这个?

4

7 回答 7

59

从我的代码复制:

pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);

其中 pInsertOid 是一个准备好的语句。

然后您可以获得密钥:

// fill in the prepared statement and
pInsertOid.executeUpdate();
ResultSet rs = pInsertOid.getGeneratedKeys();
if (rs.next()) {
  int newId = rs.getInt(1);
  oid.setId(newId);
}

希望这能给你一个好的起点。

于 2008-10-14T19:40:32.297 回答
24

extraneon 的答案虽然正确,但不适用于 Oracle

您为 Oracle 执行此操作的方式是:

String key[] = {"ID"}; //put the name of the primary key column

ps = con.prepareStatement(insertQuery, key);
ps.executeUpdate();

rs = ps.getGeneratedKeys();
if (rs.next()) {
    generatedKey = rs.getLong(1);
}
于 2012-12-14T06:19:58.497 回答
3

您是否尝试过Statement.executeUpdate()Statement.getGeneratedKeys()方法?有一篇developerWorks 文章提到了这种方法。

此外,在 JDBC 4.0 中,Sun 添加了row_id 功能,允许您获取行的唯一句柄。Oracle 和 DB2 支持该特性。对于 sql server,您可能需要第三方驱动程序,例如这个

祝你好运!

于 2008-10-14T21:26:02.567 回答
1

对于 oracle,如果您已映射序列以生成 PKEY 值,Hibernate 将使用序列中的 NEXT_VALUE。

不确定它对 MySQL 或 MS SQL 服务器有什么作用

于 2008-10-14T21:01:47.780 回答
1

Spring为此操作提供了一些有用的支持,参考指南似乎回答了您的问题:

没有一种标准的单一方法可以创建适当的 PreparedStatement(这解释了为什么方法签名是这样的)。一个适用于 Oracle 而可能不适用于其他平台的示例是......

我已经在 MySQL 上测试了这个例子,它也可以在那里工作,但我不能代表其他平台。

于 2008-10-17T16:16:59.880 回答
1

对于符合 SQL-99 的数据库,您可以使用标识列:CREATE TABLE sometable (id INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 101) PRIMARY KEY, ...

使用getGeneratedKeys()检索刚刚使用executeUpdate(String sql, int autoGeneratedKeys)插入的密钥。使用 Statement.RETURN_GENERATED_KEYS 作为第二个参数来执行更新()

于 2011-09-27T13:54:33.020 回答
-2

只需将 id 列声明为 id 整数而不是 NULL 主键auto_increment

在此之后执行此代码

ResultSet ds=st.executeQuery("select * from user");
                while(ds.next())
                {

                 ds.last();
                System.out.println("please note down your registration id  which is "+ds.getInt("id"));
                }
                ds.close();

上面的代码将显示当前行的 id

如果您删除ds.last(),它将显示 id 列的所有值

于 2015-07-31T07:45:32.647 回答