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

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

如果不是,您会如何建议我为可以访问任何SQL Server,MySQL和Oracle的代码实现此功能?

有帮助吗?

解决方案

从我的代码复制:

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);
}

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

其他提示

extraneon的回答,虽然正确,对甲骨文不起作用

您为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);
}

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

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

祝你好运!

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

不确定它对MySQL或MS SQL服务器的作用

Spring为此操作和参考指南似乎回答了您的问题:

  

没有标准的单一方式   创造一个合适的   PreparedStatement(解释原因   方法签名就是它的方式   是)。适用于Oracle的示例   并且可能无法在其他平台上运行   是...

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

对于符合SQL-99的数据库,您可以使用标识列: CREATE TABLE sometable(id INTEGER GENERATED ALERS as IDENTITY(从101开始)主键,......

使用 getGeneratedKeys() 使用 executeUpdate(String sql,int autoGeneratedKeys)。使用Statement.RETURN_GENERATED_KEYS将第二个参数执行到executeUpdate()

只需将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列的所有值

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top