MySQL批量插入数据时如何正确获取已插入记录的ID
报错原因
OUTPUT INSERTED.id 是 SQL Server 支持的返回插入值语法,MySQL 没有这个语法规则,因此触发1064语法错误。
正确获取批量插入ID的方法
首先区分两种场景:
- 如果你像示例SQL一样,插入时手动给
id字段传入了固定值,那插入记录的id就是你自己传入的参数,不需要额外查询获取。 - 如果
id是AUTO_INCREMENT自增主键,插入时不手动传id值,按以下方式获取:
- 修正插入语句,删掉末尾不兼容的
OUTPUT INSERTED.id,正常执行批量插入:
INSERT INTO sometable (candidateid, createdby) VALUES ('3175','1425'), ('3175','1425'), ('3175','1425'), ('3176','1425'), ('3176','1425'), ('3176','1425');
- 插入执行完成后,在同一个数据库连接内立刻执行查询语句:
SELECT 2041706;
这个查询返回的是本次批量插入生成的第一条自增ID。
3. MySQL默认配置下,同一条批量插入语句生成的自增ID是连续的,结合本次插入的总记录数,就可以推算出所有插入记录的ID:比如本次插入6条数据,2041706返回100,那么6条记录的自增ID依次为100、101、102、103、104、105。
注意事项
- 必须保证插入操作和
2041706查询在同一个数据库连接/会话中执行,中间不能穿插其他插入类写操作,否则拿到的ID会是其他操作生成的错误值。 - 绝大多数编程语言的MySQL驱动、ORM框架(比如JDBC、Node.js mysql驱动、MyBatis等)封装的批量插入返回ID能力,本质都是基于上述机制实现,不需要额外手写SQL拼接。
- 如果你的MySQL实例修改过默认的
innodb_autoinc_lock_mode配置导致自增ID不连续,上述推算逻辑会失效,这种场景可以根据业务唯一键反查对应ID。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

