题
是否有跨数据库平台方式来获取刚刚插入的记录的主键?
我注意到这个答案说明了您可以通过调用 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列的所有值