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 的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章