在java中获取数据库表的最后插入记录ID? [复制]

Posted

技术标签:

【中文标题】在java中获取数据库表的最后插入记录ID? [复制]【英文标题】:Getting the last inserted record id of a database table in java? [duplicate] 【发布时间】:2010-12-14 13:26:29 【问题描述】:

我有一个存储记录的数据库表 A,A 有一个带有 auto_increment 的主键(recordid),每次我向 A 中插入一条记录时,我都会获取插入的 recordid 并将其存储在另一个 masterTable 中。

我在插入 A 后立即使用 select 语句来获取这样的记录 ID:

通过recordid DESC LIMIT 1从A order中选择recordid;

但是我今天遇到了一个问题,两条记录同时插入(由不同的线程),我最终在主 ID 中存储了错误的记录 ID(两个 txns 的记录 ID 相同)

我听说过 Statement.getGeneratedKeys(),我想知道这是否真的有助于解决问题。或者处理这个问题的最佳方法是什么。

【问题讨论】:

【参考方案1】:

在不支持 generateKeys 的数据库中,您可以将 ID 放入返回参数中。例如,Oracle 提供了 RETURNING xxx INTO ?其中 xxx 是您的列名的语法。

【讨论】:

【参考方案2】:

mysql JDBC 驱动程序确实支持getGeneratedKey() 方法。查看 MySQL 手册的 20.3.5.1.4. Retrieving AUTO_INCREMENT Column Values 部分,其中:

我们演示了新的 JDBC-3.0 方法 getGeneratedKeys() 的使用,如果您需要检索 AUTO_INCREMENT 键,现在这是首选方法。

【讨论】:

【参考方案3】:

您可以使用getGeneratedKeys 方法。这个forum post 会有所帮助。

我还建议您使用像 Hibernate 这样的 ORM 工具。在 Hibernate 中,你会做这样的事情:

myTable = new myTable();
myTable.prop1 = prop1;
myTable.prop2 = prop2;
int id = session.save(myTable);

Hibernate 将发出适当的 SQL 命令(取决于所选的数据库)并返回自动生成的 ID。

【讨论】:

如果 MySQL JDBC 驱动实现了。 确实如此。如果 JDBC 驱动不支持,则需要依赖数据库特定的方法来获取 ID。 @kgiannakakis - session.save(myTable) 不返回 int。然而,它返回java.io.serializable,并且到目前为止,JDBC 驱动程序的任何实现都不支持getGeneratedKeys() 方法。所以你提到的两个案例都不会成功。它们真的有效吗? @Lion - Integer 确实实现了 Serializable。所以使用装箱可以从session.save(myTable) 中得到一个int,当然前提是你的表的映射是返回一个int。这种方法有效。我已经使用 MySQL JDBC 驱动程序成功测试了 getGeneratedKeys 方法。

以上是关于在java中获取数据库表的最后插入记录ID? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中获取 MySQL 表的最后插入 ID?

MYSQL中获取得最后一条记录的语句

获取最后插入记录的 ID - Access DAO、ODBC、SQL Server 2008 身份字段

获取mybatis中最后插入记录的id

如何在mssql中获取最新自增ID的值

如何在没有'id'列的MySql中获取最后插入的记录?