插入行jdbc的主键?

时间:2008-10-14 16:29:27

标签: java jdbc identity

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

我注意到this answer表示您可以通过调用SELECT LAST_INSERT_ID()来获取它,我认为您可以调用SELECT @@IDENTITY AS 'Identity';是否有一种常见的方法可以在jdbc中跨数据库执行此操作?< / p>

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

7 个答案:

答案 0 :(得分:50)

从我的代码复制:

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

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

答案 1 :(得分:22)

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

答案 2 :(得分:3)

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

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

祝你好运!

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

Spring为this operation提供了一些有用的支持,参考指南似乎回答了你的问题:

  

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:-2)

只需将id列声明为id integer而不是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列的值