You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:15:04