SQL(Java,h2):检索我刚刚插入数据库的单个项目的唯一 ID 的最佳方法是啥? [复制]

Posted

技术标签:

【中文标题】SQL(Java,h2):检索我刚刚插入数据库的单个项目的唯一 ID 的最佳方法是啥? [复制]【英文标题】:SQL (Java, h2): What's the best way to retrieve the unique ID of the single item I just inserted into my database? [duplicate]SQL(Java,h2):检索我刚刚插入数据库的单个项目的唯一 ID 的最佳方法是什么? [复制] 【发布时间】:2011-02-08 11:56:24 【问题描述】:

我目前的方法是这样的:

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC

这假定最新插入的项目始终具有最高的唯一 ID(主键、自动递增)。这里有异味。

替代方案?

【问题讨论】:

仅供参考,几乎重复问题:Is there a way to retrieve the autoincrement ID from a prepared statement 【参考方案1】:

如果 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?

【讨论】:

根据我的经验和知识,mysql、MSSQL、PostgreSQL、Oracle 和 DB2 等主要 RDBMS 服务器的所有当前 JDBC 驱动程序版本都支持它(Oracle 和 PostgreSQL 需要一段时间,最多大约一个一年前他们不支持它)。不幸的是,我没有使用 H2 的经验,所以我无法从头顶上判断,但快速浏览一下 Google 就知道它确实支持它。 好的,很好用!不过,这比 IDENTITY() 好吗? 确实 IDENTITY()“在幕后”,但现在使用纯 JDBC API 以更抽象和与 DB 无关的方式。每当您想切换数据库时,您的维护头痛就会减少。如果你做的一切都是正确的和标准的 SQL 方式,那么你基本上需要做的就是替换 JDBC 驱动程序和 URL/登录。您可以保持编码不变。 快速注意,在插入语句插入多条记录的情况下,这仅适用于最后生成的键的 h2。所以 h2 仅部分支持 getGeneratedKeys()。【参考方案2】:

如果使用 MySQL 你可以这样做

select last_insert_id();

如果使用 MS SQL

select scope_identity();

对于H2,我相信是

CALL SCOPE_IDENTITY();

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

【讨论】:

嗯。我想知道是否有 H2 等价物... 抱歉,最初没有看到 h2 标签。用我认为等效的内容更新了我的答案。 好吧,我将在 Java 中插入 PreparedStatement 实例,所以我可能需要 IDENTITY() 代替。但是,是的,应该这样做。谢谢。 H2 的 SCOPE_IDENTITY() 不会按预期工作。见groups.google.com/d/msg/h2-database/0xJsP993RHY/0LERpBvtLNUJ @Gili 恕我直言,它通常按预期工作,因为您只需要使用SELECT SCOPE_IDENTITY(); 而不是SET。就是这样。

以上是关于SQL(Java,h2):检索我刚刚插入数据库的单个项目的唯一 ID 的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 h2 数据库中检索 json 数据时出错

如何使用中继器中的单选按钮从 sql 中检索数据?

从 SQL 脚本在 H2 数据库中插入长文本

内存 H2 数据库,插入脚本不持久

H2 Java 插入忽略 - 允许异常

H2DB 和 Java,大约 > 两个小时的差异