Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL(Java,h2):检索刚刚插入数据库的单个项的唯一ID的最佳方法是什么?_Java_Sql_Jdbc_H2_Unique Id - Fatal编程技术网

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

SQL(Java,h2):检索刚刚插入数据库的单个项的唯一ID的最佳方法是什么?,java,sql,jdbc,h2,unique-id,Java,Sql,Jdbc,H2,Unique Id,我目前的方法是: SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC 这假定最新插入的项始终具有最高的唯一ID主键,即自动递增。这里有点异味 替代方案?如果使用MySQL,您可以 select last_insert_id(); 如果使用MS SQL select scope_identity(); 对于H2,我认为它是 CALL SCOPE_IDENTITY(); 但是我没有任何使用DB的经验,如果JDBC驱动程序支持它,您也可以使用它 St

我目前的方法是:

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC
这假定最新插入的项始终具有最高的唯一ID主键,即自动递增。这里有点异味


替代方案?

如果使用MySQL,您可以

select last_insert_id();
如果使用MS SQL

select scope_identity();
对于H2,我认为它是

CALL SCOPE_IDENTITY();

但是我没有任何使用DB的经验,如果JDBC驱动程序支持它,您也可以使用它

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?
}

嗯。我想知道是否有H2等效物……对不起,最初没有看到H2标签。更新了我的答案,我认为是等效的。我将插入Java中的PreparedStatement实例,因此我可能需要标识。但是,是的,应该这样。谢谢。H2的SCOPE_标识将无法按预期工作。请参阅@Gili IMHO,它通常按预期工作,因为您只需使用SELECT SCOPE\u IDENTITY;而不是设置。仅此而已。根据我的经验和知识,所有主要RDBMS服务器(如MySQL、MSSQL、PostgreSQL、Oracle和DB2)的当前JDBC驱动程序版本都支持它。Oracle和PostgreSQL花了一段时间才支持它,直到大约一年前他们还不支持它。不幸的是,我没有H2方面的经验,所以我无法从头脑中分辨出来,但快速浏览一下谷歌就知道它确实支持H2。好吧,太棒了!不过,这比标识好吗?它确实隐藏了标识,但现在使用纯JDBCAPI以更抽象、更不依赖数据库的方式实现了标识。每当您想切换数据库时,维护方面的麻烦就会减少。如果您以标准的SQL方式正确地完成了这项工作,那么您基本上需要做的就是替换JDBC驱动程序和URL/登录。您可以保持编码的完整性。请注意,在insert语句插入多条记录的情况下,这只适用于h2中最后生成的键。因此h2仅部分支持getGeneratedKeys.FYI,几乎是重复的问题: