【发布时间】:2010-09-17 03:27:12
【问题描述】:
有没有跨数据库平台的方式来获取你刚刚插入的记录的主键?
我注意到this answer 说您可以通过调用SELECT LAST_INSERT_ID() 来获取它,我认为您可以调用SELECT @@IDENTITY AS 'Identity'; 在jdbc 中跨数据库执行此操作的通用方法吗?
如果不是,你建议我如何为一段可以访问 SQL Server、MySQL 和 Oracle 的代码实现这个?
【问题讨论】:
有没有跨数据库平台的方式来获取你刚刚插入的记录的主键?
我注意到this answer 说您可以通过调用SELECT LAST_INSERT_ID() 来获取它,我认为您可以调用SELECT @@IDENTITY AS 'Identity'; 在jdbc 中跨数据库执行此操作的通用方法吗?
如果不是,你建议我如何为一段可以访问 SQL Server、MySQL 和 Oracle 的代码实现这个?
【问题讨论】:
只需将 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 列的所有值
【讨论】:
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),您必须提供索引而不是名称
对于符合 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 作为第二个参数来执行Update()
【讨论】:
Spring 为this operation 提供了一些有用的支持,参考指南似乎回答了您的问题:
没有标准的单一方法 创建一个合适的 PreparedStatement(这解释了为什么 方法签名就是它的方式 是)。适用于 Oracle 的示例 并且可能无法在其他平台上运行 是……
我已经在 MySQL 上测试了这个例子,它也可以在那里工作,但我不能代表其他平台。
【讨论】:
您尝试过Statement.executeUpdate() 和Statement.getGeneratedKeys() 方法吗?有一个developerWorks article 提到了这种方法。
此外,Sun 在 JDBC 4.0 中添加了row_id feature,它允许您在一行中获得唯一的句柄。 Oracle 和 DB2 支持该特性。对于 sql server,您可能需要第三方驱动程序,例如 this one。
祝你好运!
【讨论】:
对于 oracle,如果您已映射序列以生成 PKEY 值,Hibernate 将使用序列中的 NEXT_VALUE。
不确定它对 MySQL 或 MS SQL 服务器有什么作用
【讨论】:
复制自我的代码:
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);
}
希望这能给你一个好的起点。
【讨论】:
@@identity。