如何给MySQL 5.7存储过程传值列表参数实现批量插入
MySQL 5.7 批量插入用户数据存储过程实现方案
需求背景
当前使用MySQL 5.7版本,在批量插入n条数据的场景下,执行两次批量插入n条数据的语句,效率远高于n次调用单条插入的存储过程。需要实现可接收姓名列表、团队ID参数的批量插入存储过程。
原有单条插入存储过程
CREATE PROCEDURE create_data_user(IN name VARCHAR(100), IN data_user_team_id INT) BEGIN START TRANSACTION; INSERT INTO users (users.name, users.type) VALUES (name, "team_data"); INSERT INTO team_members (team_id, user_id, mod_time) VALUES (data_user_team_id, 3514182, UNIX_TIMESTAMP()); COMMIT; END ;;
固定条数批量插入示例(以2条为例)
CREATE PROCEDURE create_data_user(IN name VARCHAR(100), IN name2 VARCHAR(100), IN data_user_team_id INT) BEGIN START TRANSACTION; INSERT INTO users (users.name, users.type) VALUES (name, "team_data"), (name2, "team_data"); INSERT INTO team_members (team_id, user_id, mod_time) VALUES (data_user_team_id, 3514182, UNIX_TIMESTAMP()), (data_user_team_id, 3514182+1, UNIX_TIMESTAMP()); COMMIT; END ;;
轻量批量插入实现方案(临时表方案)
该方案实现简单,允许存在轻微性能损耗,性能远优于多次单条插入,适配需求。
调用侧代码
CREATE TEMPORARY TABLE names (name); INSERT INTO names VALUES (name1), (name2), ...; CALL create_data_users(1);
对应存储过程代码
CREATE PROCEDURE create_data_users(IN data_user_team_id INT) BEGIN START TRANSACTION; INSERT INTO users (users.name, users.type) SELECT name, "team_data" FROM names; SET @num=3514182; INSERT INTO team_members (team_id, user_id, mod_time) SELECT data_user_team_id, @num:=@num+1, UNIX_TIMESTAMP() FROM names; COMMIT; END ;;
方案优势
- 实现逻辑简单,无需复杂的字符串拆分、动态SQL拼接操作
- 仅执行两次批量插入语句,性能远高于循环单条插入
- 兼容MySQL 5.7版本,无额外依赖
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

