SQL(Java,h2):检索刚插入数据库的单个项的唯一ID的最佳方法是什么?

Dad*_*box 13 java sql jdbc h2 unique-id

我目前的方法是这样的:

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)

这假设最新插入的项始终具有最高的唯一ID(主键,自动增量).这里闻起来有点不对劲.

备择方案?

Bal*_*usC 26

如果JDBC驱动程序支持它,您也可以使用Statement#getGeneratedKeys()它.

String sql = "INSERT INTO tbl (col) VALUES (?)";
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, col);
preparedStatement.executeUpdate();
generatedKeys = preparedStatement.getGeneratedKeys();
if (generatedKeys.next()) {
    long id = generatedKeys.getLong(1);
} else {
    // Throw exception?
}
Run Code Online (Sandbox Code Playgroud)

  • 根据我的经验和知识,主要的RDBMS服务器的所有当前JDBC驱动程序版本(如MySQL,MSSQL,PostgreSQL,Oracle和DB2)都支持它(Oracle和PostgreSQL需要一段时间,直到大约一年前他们不支持它).不幸的是,我没有使用H2的经验,所以我无法从头顶看出来,但是对Google的快速浏览了解到它确实支持它. (2认同)
  • 它***IDENTITY()`"在引擎盖下",但现在使用纯JDBC API以更抽象和数据库不可知的方式.每当您想要切换数据库时,您的维护都会减少.如果你采用所有正确的标准SQL方式,那么你基本上需要做的就是替换JDBC驱动程序和URL /登录.您可以保持编码完好无损. (2认同)
  • 快速注意,这仅适用于在插入语句插入多条记录的情况下最后生成的键的 h2。因此 h2 仅部分支持 getGeneratedKeys()。 (2认同)

Sea*_*ean 6

如果使用MySQL,你可以做到

select last_insert_id();
Run Code Online (Sandbox Code Playgroud)

如果使用MS SQL

select scope_identity();
Run Code Online (Sandbox Code Playgroud)

对于H2,我相信它

CALL SCOPE_IDENTITY();
Run Code Online (Sandbox Code Playgroud)

但我对该数据库没有任何经验