在MySQL中获取最后插入的自增ID

16

我想获取类似于mysql_insert_id()的mysql命令,该命令检索最后插入行的auto_increment id。我该如何在Java中获取它?

rs = st.executeQuery("select last_insert_id() from schedule");
lastid = rs.getString("last_insert_id()");

我的lastid被声明为INT。我不知道在rs.get中要使用什么以及参数是什么。

7个回答

28

使用JDBC,你可以使用Connection.PreparedStatement(query, int)方法。

PreparedStatement pstmt = conn.prepareStatement(Query, Statement.RETURN_GENERATED_KEYS);  
pstmt.executeUpdate();  
ResultSet keys = pstmt.getGeneratedKeys();    
keys.next();  
key = keys.getInt(1);

2
我尝试了这种方法,但它总是返回1。我有些认为这是用来检查是否向数据库插入任何查询的? - Maki92
2
@Maki92,我不太理解你的评论。这段代码只是从你的表中返回最后一个自动增量ID。顺便说一下,据我所知,这是使用JDBC的标准方法。 - PermGenError
1
我曾经看到别人使用它,但他们遇到了和我一样的问题。代码总是从表格中返回1。 - Maki92
@Maki92 我非常确定那么这就是他们代码的问题。我自己使用过它,从未遇到过这样的问题.. :) - PermGenError
请参阅http://dev.mysql.com/doc/refman/5.5/en/connector-j-usagenotes-last-insert-id.html。 - Mark Rotteveel
3
我有同样的问题。不管实际索引是多少,它总是返回1。 - YankeeWhiskey

25

尝试使用别名

rs = st.executeQuery("select last_insert_id() as last_id from schedule");
lastid = rs.getString("last_id");

为什么要添加FROM语句?这是有害的,因为如果您的表包含2行,则会得到2行结果。"SELECT LAST_INSERT_ID();"就足够了。 - realmfoo
3
你可以使用rs.getString(1)来替代rs.getString("last_id")。 - realmfoo

7
请参考此篇帖子获取关于获取最后插入值id的解答和解释。
Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
    risultato=rs.getInt(1);
}

3

为什么不呢?

SELECT MAX(id) FROM schedule

如果你的列名不是 id,那么你需要相应地在上面的查询中进行替换。你可以像这样使用它:
rs = st.executeQuery("SELECT MAX(id) AS id FROM schedule");
int lastid = rs.getInt("id");

我没想到呢..哈哈..上次用PHP时使用了mysql_insert_id();,突然转到Java就只关注它了。谢谢建议。 :) - Maki92
由于“id”不存在,“int lastid = rs.getInt(“id”);”将抛出错误。您应该在选择语句中首先添加别名。rs = st.executeQuery("SELECT MAX(id) id FROM schedule"); - John Woo
@JW,谢谢你的提示。我已经更新了我的答案。 - jlordo
13
不应该依赖于max(id),因为另一个线程可能会在你的插入和选择语句之间插入一行新记录,导致你获取错误的id。 - realmfoo
是的,mysql_inserted_id和last_inserted_id函数也适用于此情况,可能会因为其他线程的竞争条件而导致问题,特别是考虑到通常Web应用程序共享相同的数据库用户。 - Igor Donin
@jlordo,如果我的最后插入的 Id 有多于 1 行呢?我还能使用你提到的相同 SQL 吗? - Karen Goh

0

您可以使用以下查询语句获取最后插入行的自增ID。

SELECT (max(auto_incr_id)) from table_name;

0

另一种方式:

ResultSet rs = stmt.executeQuery("SELECT last_insert_id()");

while(rs.next()){
    System.out.println("id = " + rs.getLong(1));

}

0
另一个选项是: < p >< code >SELECT id FROM table_name ORDER BY id DESC LIMIT 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接