插入行的主键jdbc?

45

有没有一种跨数据库平台的方法可以获取您刚插入的记录的主键?

我注意到这个回答说你可以通过调用 SELECT LAST_INSERT_ID() 来获得它,而我认为你可以调用 SELECT @@IDENTITY AS 'Identity';。在 JDBC 中是否有通用方法可以实现这一点?

如果没有,你会如何为能够访问任何 SQL Server、MySQL 和 Oracle 的代码实现此功能?

7个回答

65

从我的代码中复制:

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
适用于Postgres,但不适用于Oracle。 - Broken_Window
在 Sybase ASE 上,如果您已安装了元数据访问器信息表,则此操作将正常工作。否则,您必须使用 @@identity - danny

27

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);
}

在我的电脑上,Oracle 11g Express和Java 8是可以兼容的。 - Broken_Window
1
成功了!需要特别注意 rs.getLong(1),你必须提供索引而不是名称。 - SashikaXP

3

1

对于Oracle,如果您已经映射了一个序列用于PKEY值生成,Hibernate将使用该序列的NEXT_VALUE。

不确定它在MySQL或MS SQL Server上是如何工作的。


1

Spring提供了一些有用的支持此操作,参考指南似乎可以回答您的问题:

没有标准的单一方法来创建适当的PreparedStatement(这就解释了为什么方法签名是这样的)。一个在Oracle上运行的示例可能在其他平台上无法正常工作,例如...

我已经在MySQL上测试过这个示例,它也可以正常工作,但我不能保证它在其他平台上也能正常工作。


1

对于符合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。


-2

只需将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列的所有值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接