在MySQL数据库的使用过程中,自增id是表设计中非常常见的主键类型,当向表中插入数据时,数据库会自动为自增id字段生成唯一的递增值。很多业务场景下,我们需要在插入数据后获取到这个刚生成的自增id,用于后续的业务逻辑处理,比如关联其他表的数据、返回给前端展示等。

获取MySQL自增id的常用方法
1. 使用LAST_INSERT_ID()函数
LAST_INSERT_ID()是MySQL内置的函数,用于返回当前连接中最近一次插入操作生成的自增id值,这是最推荐的使用方式,因为它基于连接级别生效,不会受到其他连接插入操作的影响。
示例代码如下:
-- 先插入一条数据,假设表user有自增id字段id,以及name字段
INSERT INTO user (name) VALUES ('张三');
-- 获取刚插入数据生成的自增id
SELECT LAST_INSERT_ID() AS new_id;
需要注意的是,LAST_INSERT_ID()只返回最近一次成功插入的自增id,如果插入操作没有触发自增id生成,或者插入失败,这个函数会返回0。另外,如果一次插入多行数据,它会返回这多行数据中第一个生成的自增id值。
2. 使用@@identity变量
@@identity是MySQL的全局变量,同样可以返回最近一次插入操作生成的自增id,但是它的作用范围是当前会话,而且如果插入操作触发了其他表的自增id生成(比如触发器),它返回的是最后一个触发的自增id,这一点和LAST_INSERT_ID()有区别。
示例代码如下:
INSERT INTO user (name) VALUES ('李四');
-- 获取自增id
SELECT @@identity AS new_id;
3. 查询information_schema系统表
我们可以通过查询information_schema数据库中的TABLES表,获取指定表的自增id当前值,不过这种方式获取的是表当前的自增计数器值,不是某一次插入操作生成的具体id,适合需要了解表自增进度的场景。
示例代码如下:
-- 查询user表的当前自增id值,table_schema是数据库名,table_name是表名 SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'test_db' AND TABLE_NAME = 'user';
4. 插入后直接查询最大id
如果表中没有其他并发插入操作,可以通过查询表中id的最大值来获取刚插入的id,但是这种方式在高并发场景下非常不可靠,因为其他连接可能同时插入数据,导致查询到的最大值不是自己插入的那条。
示例代码如下:
INSERT INTO user (name) VALUES ('王五');
-- 查询最大id,仅适合无并发场景
SELECT MAX(id) AS new_id FROM user;
不同方法的对比
我们可以通过下面的表格更清晰地看到不同方法的差异:
| 方法 | 作用范围 | 是否受其他表触发器影响 | 适用场景 |
|---|---|---|---|
| LAST_INSERT_ID() | 当前连接 | 否 | 单条插入后获取自增id,推荐优先使用 |
| @@identity | 当前会话 | 是 | 无触发器场景下的自增id获取 |
| 查询information_schema | 全局表级别 | 否 | 查看表自增进度,非单条插入场景 |
| 查询MAX(id) | 全局表级别 | 否 | 无并发的低频插入场景 |
编程语言中获取自增id的示例
在实际开发中,我们通常会通过编程语言操作数据库,下面以Python的pymysql库为例,展示如何获取自增id:
import pymysql
# 建立数据库连接
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
database='test_db',
charset='utf8mb4'
)
cursor = conn.cursor()
# 插入数据
sql = "INSERT INTO user (name) VALUES ('赵六')"
cursor.execute(sql)
# 获取自增id
new_id = cursor.lastrowid
print(f"刚插入的自增id是:{new_id}")
# 提交事务并关闭连接
conn.commit()
cursor.close()
conn.close()
大部分编程语言的MySQL驱动都提供了类似lastrowid的属性,底层其实就是调用了LAST_INSERT_ID()函数,使用起来更加方便。
注意事项
- 获取自增id的操作和插入操作必须在同一个数据库连接中完成,否则无法正确获取到对应的自增id。
- 如果插入操作使用了
INSERT IGNORE或者ON DUPLICATE KEY UPDATE,如果数据没有实际插入,LAST_INSERT_ID()会返回0或者旧的自增id,需要根据实际情况判断。 - 不要在高并发场景下使用查询MAX(id)的方式获取自增id,很容易出现数据错误。
MySQL自增idLAST_INSERT_ID@@identitySQL查询修改时间:2026-07-02 23:42:29