如何在MariaDB/MySQL单INSERT语句中获取多行插入的自增ID
在MariaDB/MySQL中获取多行INSERT的自增ID方法
嘿,这个场景我太熟了!用单条INSERT批量插数据,还想拿到自动生成的自增ID,在MariaDB和MySQL里有两种实用方案,分版本给你说:
一、新版本直接用INSERT ... RETURNING(首推!)
从MariaDB 10.5.0、MySQL 8.0.20开始,数据库直接支持RETURNING子句——这简直是为批量插数据拿ID量身定做的!插入完成后直接返回所有生成的自增ID,一步到位,还没并发风险。
举个例子,假设你有个users表:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL );
批量插入并获取ID的语句就是:
INSERT INTO users(username) VALUES ('Luna'), ('Ginny'), ('Harry') RETURNING id;
执行完这条语句,结果集里就会列出这三行对应的自增ID,直接取就行,简单粗暴还准确。
二、旧版本兼容方案:798403 + ROW_COUNT()
如果你的数据库版本比较老,不支持RETURNING,那可以用这个组合来凑,但要注意使用前提。
原理:
798403:返回本次INSERT操作生成的第一行的自增IDROW_COUNT():返回本次INSERT影响的行数(也就是你插了多少条)
默认情况下,自增ID是连续递增的(步长为1,且没有其他会话同时修改自增序列),所以所有生成的ID就是从798403开始,连续的ROW_COUNT()个数字。
操作步骤:
- 先执行批量插入:
INSERT INTO users(username) VALUES ('Ron'), ('Hermione'), ('Draco');
- 接着查询获取ID范围:
SELECT 798403 AS first_id, ROW_COUNT() AS total_rows;
比如返回first_id=10,total_rows=3,那生成的ID就是10、11、12。
⚠️ 重要提醒:这个方法只适用于没有并发插入、自增步长为默认1的场景!如果有其他会话同时往同一张表插数据,或者你修改过自增步长,那算出来的ID就会不准,所以能升级数据库用第一种方法就别用这个。
额外小提示
如果是在应用代码里(比如PHP、Java),还要注意驱动的支持:
- 支持
RETURNING的驱动(比如PDO MySQL 8.0+)可以直接获取返回的结果集 - 旧驱动的话,调用
lastInsertId()拿到第一个ID,再结合rowCount()的结果来计算后续ID
内容的提问来源于stack exchange,提问作者Golo Roden
相关产品推荐
相关产品推荐

