是否有跨数据库平台方式来获取刚刚插入的记录的主键?
我注意到this answer表示您可以通过调用SELECT LAST_INSERT_ID()
来获取它,我认为您可以调用SELECT @@IDENTITY AS 'Identity';
是否有一种常见的方法可以在jdbc中跨数据库执行此操作?< / p>
如果不是,您会如何建议我为可以访问任何SQL Server,MySQL和Oracle的代码实现此功能?
答案 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列的值