有没有一种跨数据库平台的方法可以获取您刚插入的记录的主键?
我注意到这个回答说你可以通过调用 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);
}
rs.getLong(1)
,你必须提供索引而不是名称。 - SashikaXP对于Oracle,如果您已经映射了一个序列用于PKEY值生成,Hibernate将使用该序列的NEXT_VALUE。
不确定它在MySQL或MS SQL Server上是如何工作的。
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)。在executeUpdate()的第二个参数中使用Statement.RETURN_GENERATED_KEYS。
只需将id列声明为id integer not NULL primary key 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列的所有值
@@identity
。 - danny