是否有跨数据库平台的方式来获取您刚刚插入的记录的主键?
我注意到这个答案说你可以通过调用来获取它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。
您为 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 ALWAYS AS IDENTITY(START WITH 101) PRIMARY KEY, ...
使用getGeneratedKeys()检索刚刚使用executeUpdate(String sql, int autoGeneratedKeys)插入的密钥。使用 Statement.RETURN_GENERATED_KEYS 作为第二个参数来执行更新()
只需将 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 列的所有值