mysql返回自增id

MySQL AUTO_INCREMENT 机制解析
SELECT LAST_INSERT_ID() / SELECT @@INDENTITY 都是单个连接的,不存在所谓的两个人都同时插入,分不清的问题:
The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions. 

唯一的问题是,如果一句INSERT插入多条,返回的是第一个ID
mysql> INSERT INTO t VALUES
    -> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+----+------+
4 rows in set (0.01 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)
在使用 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、付费专栏及课程。

余额充值