MySQL插入数据后返回自增id的方法

高效获取自增ID
本文探讨了在数据库操作中如何避免使用低效的查询语句来获取刚插入记录的自增ID,特别是在处理大量数据和并发操作时。推荐使用SELECT LAST_INSERT_ID()函数,它能确保返回正确的ID值,且不受其他客户端的影响。
在数据库操作中,很可能在执行插入操作(A表)时,需要先在另一张表(B表)中插入一条记录,然后获取其主键id,并将这id插入这张表(A表)。
对于新手而言,想到的可能是我先在B表执行“insert into”插入一条记录,然后立即执行“select max(id)"查询操作,查询最大id就行了。这样做,看似可行,但有很大隐患存在:
1、在数据量庞大的情况下,第二条查询语句效率极低。我遇到的情况是,从一个特征表里,找出某条特征的数据,一条特征有1K的数据量,可以想象,如果里面有很多特征的话,每次拿1K的数据量去对比,对比n次,效率太低,也容易出错。
2、并发操作的时候,无法保证”select max(id)“返回的仍然是刚才我插入的记录,也有可能是另一个人的。

带着上述问题,先总结一下有哪些方法可以返回自增id,最好是不要执行那一条查询语句。有幸看到了这位大神的博客( 链接),他总结得很全面了,我就不累述了。
推荐使用
SELECT LAST_INSERT_ID();

因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数 将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录,  LAST_INSERT_ID返回一个列表。
在使用 MySQL 数据库时,插入记录后获取自 ID 是常见的需求之一。MySQL 提供了多种方式来实现这一目标,以下是几种常用的方法。 ### 使用 `LAST_INSERT_ID()` 函数 `LAST_INSERT_ID()` 是 MySQL 提供的一个内置函数,用于返回最近一次插入操作中生成的自 ID 值。这个函数在一个连接会话中是线程安全的,因此可以放心使用而不用担心其他客户端的影响。 #### 示例 SQL 语句: ```sql INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com'); SELECT LAST_INSERT_ID(); ``` 这段 SQL 代码首先向 `users` 表中插入了一条记录,然后通过 `SELECT LAST_INSERT_ID();` 获取刚刚插入记录的自 ID [^2]。 ### 在 Java 中使用 `Statement.RETURN_GENERATED_KEYS` 如果你正在使用 Java 编写应用程序,并且希望通过 JDBC 操作 MySQL 数据库,可以通过设置 `Statement.RETURN_GENERATED_KEYS` 来获取自动生成的主键值。 #### 示例 Java 代码: ```java String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; try (PreparedStatement pstmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { pstmt.setString(1, "李四"); pstmt.setString(2, "lisi@example.com"); int affectedRows = pstmt.executeUpdate(); if (affectedRows == 0) { throw new SQLException("Creating user failed, no rows affected."); } try (ResultSet generatedKeys = pstmt.getGeneratedKeys()) { if (generatedKeys.next()) { System.out.println("Generated key: " + generatedKeys.getLong(1)); } else { throw new SQLException("Creating user failed, no ID obtained."); } } } ``` 在这个例子中,我们创建了一个带有 `Statement.RETURN_GENERATED_KEYS` 参数的 `PreparedStatement` 实例,执行完插入操作后,调用 `getGeneratedKeys()` 方法来获取结果集,进而得到自 ID [^3]。 ### 使用 MyBatis 框架 对于使用 MyBatis 框架的开发者来说,MyBatis 提供了 `<selectKey>` 元素来处理这种情况。可以在插入语句之后立即查询 `LAST_INSERT_ID()` 并将其映射到实体类的属性中。 #### 示例 XML 映射文件配置: ```xml <insert id="insertUser"> <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO users (name, email) VALUES (#{name}, #{email}) </insert> ``` 这里定义了一个名为 `insertUser` 的插入操作,在插入数据之后,会执行 `<selectKey>` 标签内的 SQL 查询,将最新的自 ID 赋值给 `User` 对象的 `id` 属性 [^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值