MySQL 5.7的LAST_INSERT_ID()函数在批量插入时返回什么值?

P粉602998670

P粉602998670

2026-07-27

867人浏览

原创

last_insert_id()在批量插入时只返回第一条记录的自增id,而非最大值或全部id;它绑定当前连接、不跨事务、不因回滚重置,且易被后续插入覆盖,故须紧接insert后立即获取。

mysql 5.7的last_insert_id()函数在批量插入时返回什么值?

批量插入时 LAST_INSERT_ID() 返回第一个 ID,不是最大值

执行 INSERT INTO t (name) VALUES ('a'), ('b'), ('c') 后,LAST_INSERT_ID() 返回的是这一批中**第一行实际分配到的自增 ID**,比如 100,而不是 102。它不关心你插了几行,只认“本次 INSERT 语句生成的第一个自增值”。

常见错误现象:用这个值去判断“最后一条是否成功插入”,或者当成“本次插入的最大 ID”来分页、校验——这会出错。因为 100~102 都已写入,但函数只告诉你起点。

  • 即使表里已有 ID 99,新批量插入从 100 开始,LAST_INSERT_ID() 就是 100
  • 如果中间有跳号(比如因 innodb_autoinc_lock_mode = 2 导致分配了 100、101、104),它仍返回 100
  • 显式指定部分 ID(如 VALUES (105, 'x'), (NULL, 'y'))时,只有 NULL 触发自增,LAST_INSERT_ID() 返回那个自增出来的值(比如 106),不是 105

为什么不能在 INSERT 后隔几条语句再调用

必须在同一次数据库连接中、紧接在 INSERT 之后立刻获取。中间哪怕只执行一条 UPDATE 或另一个 INSERT,只要它也触发了自增,LAST_INSERT_ID() 就会被覆盖。

典型坑:事务中先插 A 表,再插 B 表并想用 A 的 ID 做外键,结果在 B 插完后才查——此时拿到的是 B 表的 ID,不是 A 的。

MySQL(Linux)
MySQL(Linux)

MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。

下载
  • PHP 中应直接用 $pdo->lastInsertId()$mysqli->insert_id,而不是写 SELECT LAST_INSERT_ID()
  • 用连接池时,上一个请求留下的值可能还在,务必在获取连接后立即读取或重置(例如执行 SELECT LAST_INSERT_ID(0)
  • 事务回滚不影响该值:ID 已分配且不可回收,LAST_INSERT_ID() 仍返回那个作废的值

LAST_INSERT_ID(expr) 能强行改写返回值

你可以用 LAST_INSERT_ID(123) 主动设置会话级变量,之后调用无参 LAST_INSERT_ID() 就返回 123。这在某些场景下有用,比如模拟插入、绕过自增逻辑做外键关联。

但要注意:这个设置是会话级的,且会覆盖之前所有自动产生的值;一旦设了,后续真正的 INSERT 也不会自动更新它,除非你再执行一次无参调用或另一次 INSERT

  • LAST_INSERT_ID(456) 之后,SELECT LAST_INSERT_ID() 返回 456
  • 接着执行 INSERT INTO t (name) VALUES ('test'),新 ID 是 457,但 LAST_INSERT_ID() 仍为 456 —— 直到你再次调用它(这时才刷新为 457)
  • 别在触发器或存储过程中随意用这个,容易污染父上下文的值

什么情况下根本拿不到预期的 ID

当业务涉及并发写、跨服务协调、或主键不用 AUTO_INCREMENT 时,LAST_INSERT_ID() 就不够用了。它只保证“本连接最近一次自增插入的第一个 ID”,不保证原子性、不跨连接、也不反映当前表最大 ID。

比如用 UUID 或雪花 ID 当主键,LAST_INSERT_ID() 根本不生效;又比如批量导入脚本分多线程跑,每个线程都得自己维护 ID 映射,不能靠这个函数同步。

  • 不要依赖它做分布式 ID 分配
  • 不要用它替代 SELECT MAX(id)(后者慢、不准、有竞态)
  • 真正需要“全部插入 ID 列表”时,得用应用层生成 ID(如提前 SELECT AUTO_INCREMENT FROM information_schema.TABLES 预占范围),或改用返回多值的方案(如 PostgreSQL 的 RETURNING
真正难处理的不是函数本身,而是它只解决“我刚插的那条起始 ID 是多少”,而多数业务真正想要的是“我刚插的这几条,各自 ID 是多少”。这个 gap 很少被意识到,直到上线后数据对不上。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1118

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

754

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

472

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

1377

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

1903

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

618

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

2246

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

1964

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

2395

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 124人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 224人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习