mysql 批量录入 id_Mysql 批量插入数据 提前获得主键id

最近在做分销功能的按组分销模块时,一次需要插入一万多条数据,同时还需要获得插入数据的主键 id ,用于后续逻辑的使用。

最初我是通过循环,一条一条的插入,然后一边插入,一边执行数据更新。这种方式,慢到自己都不能忍,更何况是用户了,于是想到了使用批量插入的方式进行优化。

在网上查了查,批量插入主要有三种方式:

1、循环插入(这种方式就是我开篇介绍的方式,慢到不能忍);

2、使用事务提交(这种方式我觉得操作起来很麻烦,没有采用);

3、将SQL语句进行拼接,使用

insert into table () values  (),(),(),()然后再一次性插入。如果字符串太长,则需要配置下MYSQL,在

mysql 命令行中运行 :set global max_allowed_packet =

2*1024*1024*10;(我采用了这种方式,速度非常快)

$insetSql = "INSERT INTO hotel_room_fenxiao (`id`,`room_id`,`pfs_id`,`add_id`,`fxs_id`,`add_price`,`is_effect`) VALUES ";

foreach ($insert_arr as $tmpInserInfo){

$insetSql .= "({$tmpInserInfo['id']},{$tmpInserInfo['room_id']},{$tmpInserInfo['pfs_id']},{$tmpInserInfo['add_id']}, {$tmpInserInfo['fxs_id']},{$tmpInserInfo['add_price']},{$tmpInserInfo['is_effect']}),";

}

$insetSql = substr($insetSql, 0,-1);//将最后一个“,”逗号去掉

$insetSql .=";";

$GLOBALS['db']->query($insetSql);

通过上述,成功解决了插入速度慢的问题,但是,还有一个问题需要解决,那就是我需要获得刚刚插入那条数据的主键 id,对数据进行更新,我是怎么做的呢?

1、提前取出该表的最大主键id(定义为 $maxId)

2、在循环组装要插入数据时,对 $maxId 进行“加一”操作(++$maxId),将最新的 $maxId 作为主键进行插入

也就是说,在插入的sql中,我们自己把主键id设定好了。

由于这种批量插入数据的操作耗时非常短,所以我觉得同一个时刻,同时有人在操作分销功能的可能性很小,所以我认为出现主键id重复,导致插入失败的可能性就很小。


版权声明:本文为weixin_30652105原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。