Contents

mysql 批量插入 获取所有自增ID

背景

批量插入后,对刚插入的数据进行后续操作,需要获取所有插入的id,但执行sql只返回第一条id

思路

假设批量插入的数据的自增ID是连续的,则可以通过第一个自增ID获取所有自增ID

测试

理论上

批量插入的数据的自增ID是否是连续的,即插入过程中,单独插入其他数据,批量插入的自增ID是否连续

实践

  • 生成批量插入10w条数据的sql
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$s=<<<SQL
INSERT INTO `XXXX` (
    `test_id`,
    `operate_id`,
    `create_time`
)
VALUES
%s;
SQL;
$a=array();
for ($i=0;$i<100000;$i++){
    $a[]="('".rand(10000000,99999999)."', 'system', NOW())";
}
print_r(sprintf($s,implode(',',$a)));
exit(1);
  • navicat打开两个页面,一个是上面的sql,一个是一条单独插入的sql(这条sql的test_id,要大于上面sql里随机数的最大值,方便查看)
步骤
  • 先点击执行上面的sql(应该会执行20多秒吧),中间随机点击单条sql
  • 筛选单条sql中的test_id,可以发现开始几条都是小于批量的自增ID的
  • 在批量执行快结束的时候,插入的单条sql的自增ID是大于批量的,并没有单条sql的自增ID在批量中间
  • 所以批量插入的自增ID是连续的
  • 假设成立,可以这种方式获取批量插入的所有自增ID
coffee