2008-10-14 99 views
34

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

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

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

回答

45

从我的代码复制:

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

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

+0

适用于Postgres,但不适用于Oracle – 2016-03-14 15:22:20

+0

在Sybase ASE上,只要您已安装元数据存取器信息表,就可以工作。否则,你必须使用`@@ identity`。 – danny 2016-09-09 08:32:33

1

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

不知道它做什么的MySQL或MS SQL服务器

1

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

没有一个标准的单一方式 创建一个适当的 PreparedStatement的(这可以解释为什么 的方法签名它的方式是 )。这对甲骨文 工作,不得在其他平台上 是工作的一个例子...

我测试过在MySQL这个例子中,它在那里工作过,但我不能在其他平台上说话。

19

extraneon的答案,虽然正确,不适合甲骨文工作。

您甲骨文做到这一点的方法是:

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

只是声明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(); 

以上代码会告诉你当前行的编号

如果你rem ove ds.last()比它会显示id列的所有值