首页
学习
活动
专区
圈层
工具
发布

mysql存储过程批量insert

基础概念

MySQL存储过程是一种预编译的SQL代码块,可以在数据库中存储并重复调用。存储过程可以包含一系列的SQL语句和控制结构,用于执行复杂的数据库操作。批量插入(Batch Insert)是指一次性插入多条记录到数据库中,而不是逐条插入。

优势

  1. 性能提升:批量插入可以显著减少网络开销和数据库的I/O操作,从而提高数据插入的速度。
  2. 代码复用:存储过程可以在多个应用程序中重复调用,减少代码重复。
  3. 事务管理:存储过程可以更好地管理事务,确保数据的一致性和完整性。

类型

MySQL存储过程批量插入主要有以下几种类型:

  1. 单条插入:每次插入一条记录。
  2. 多条插入:一次性插入多条记录。
  3. 循环插入:通过循环逐条插入记录。

应用场景

批量插入适用于以下场景:

  1. 数据导入:从外部数据源导入大量数据到数据库中。
  2. 批量更新:需要批量更新多条记录的场景。
  3. 日志记录:记录大量日志信息时。

示例代码

以下是一个简单的MySQL存储过程示例,用于批量插入数据:

代码语言:txt
复制
DELIMITER //

CREATE PROCEDURE BatchInsert(IN tableName VARCHAR(255), IN data JSON)
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE rowCount INT;
    DECLARE record JSON;
    DECLARE columns VARCHAR(1000);
    DECLARE values VARCHAR(1000);

    SET rowCount = JSON_LENGTH(data);

    WHILE i < rowCount DO
        SET record = JSON_EXTRACT(data, CONCAT('$[', i, ']'));
        SET columns = '';
        SET values = '';

        -- 动态生成列名和值
        SELECT GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(record, CONCAT('$."', column_name, '"'))) ORDER BY column_name SEPARATOR ', ')
        INTO columns FROM information_schema.COLUMNS
        WHERE table_name = tableName;

        SELECT GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(record, CONCAT('$."', column_name, '"'))) ORDER BY column_name SEPARATOR ', ')
        INTO values FROM information_schema.COLUMNS
        WHERE table_name = tableName;

        -- 执行插入操作
        SET @sql = CONCAT('INSERT INTO ', tableName, ' (', columns, ') VALUES (', values, ')');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

        SET i = i + 1;
    END WHILE;
END //

DELIMITER ;

参考链接

常见问题及解决方法

  1. 性能问题
    • 原因:批量插入时,如果数据量过大,可能会导致性能瓶颈。
    • 解决方法:可以分批次插入数据,或者使用LOAD DATA INFILE语句进行批量导入。
  • 事务管理
    • 原因:在批量插入过程中,如果发生错误,可能会导致部分数据插入成功,部分失败。
    • 解决方法:使用事务管理,确保所有数据要么全部插入成功,要么全部失败。
  • 动态列名和值
    • 原因:在动态生成SQL语句时,可能会遇到列名或值的格式问题。
    • 解决方法:确保列名和值的格式正确,并使用JSON_EXTRACTJSON_UNQUOTE函数处理JSON数据。

通过以上方法,可以有效解决MySQL存储过程批量插入过程中遇到的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MySQL实现批量Insert和分页查询

    一 : MySQL实现批量插入测试数据 方法:存储过程实现 在这之前先查看一下表结构 desc test;方便写插入语句: ?...存储过程: DROP PROCEDURE IF EXISTS test_insert;--如果存在此存储过程则删掉 DELIMITER $ create procedure test_insert()...结尾,回车后自动执行,在存储过程中“;”往往不代表指令结束,马上运行,而DELIMITER原本就是“;”的意思,因此用这个命令转换一下“;”为“$”,这样只有收到“$”才认为指令结束可以执行。...1 : 记得将语句的结束符号恢复为分号:delimiter ; 2 :运行存储过程之前,test表是空的: ? 3 :创建存储过程: ?...4 :查看存储过程是否创建成功:show procedure status; ? 5 :运行命令:call test_insert(); ? 6:查看效果: ?

    4.9K20

    MySQL 存储过程

    1.1 简介 1.1.1 概述   MySQL 5.0 版本开始支持存储过程。存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。...④ 存储过程可以用在数据检验,强制实行商业逻辑等。 ☞ 缺点  ① 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他的数据库系统时,需要重写原有的存储过程。  ...1.2 存储过程的使用 1.2.1 创建存储过程 ☞ 语法 create procedure 存储过程名([参数模式] 参数名 参数类型) begin # 变量定义 declare name type...(0.07 sec) # in 参数 mysql> create procedure instest(id int, money varchar(20)) begin insert into...1.2.3 调用存储过程 ☞ 语法 call 存储过程名称(参数列表); ☞ 示例 mysql> call showtest; +----+-------+ | id | money | +----+-

    17.6K31

    MySQL存储过程

    MySQL的存储过程 存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。...MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT: IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 OUT:该值可在存储过程内部被改变...注释 MySQL存储过程可使用两种风格的注释: 双杠:--,该风格一般用于单行注释 C风格: 一般用于多行注释 MySQL存储过程的调用 用call和你过程名以及一个括号,括号里面根据需要,加入参数...数据库.存储过程名; MySQL存储过程的修改 ALTER PROCEDURE 更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。...PROCEDURE [过程1[,过程2…]] 从MySQL的表格中删除一个或多个存储过程。

    17.1K30

    MySQL存储过程

    文章目录 创建/调用存储过程 存储过程体 为语句块贴标签 参数列表 存储过程的优缺点 存储过程的优点 存储过程的缺点 存储过程和函数可以理解为一段sql的集合,他们被事先编译好并且存储在数据库中。...创建/调用存储过程 create procedure 存储过程名(参数列表) begin 存储过程体 end 例如: delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义...-> insert into t1(filed) values(i); -> set i=i+1; -> end while; -> end;// mysql...create procedure pro12() -> begin -> declare i int default 0; -> loop_label: loop -> insert...因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null +-------+ | p_out | +-------+ | 2 | +-------+ mysql>

    13.6K30

    MySQL(存储过程)

    存储过程调用 语法: call 存储过程名称(实参列表); 注意:实参列表中包含有输出类型的参数 代码实例: call pro_insert(); 当调用这个存储过程,会把创建成功的创建过程中的语句执行一遍...存储过程演示 无参的存储过程 代码实例: 向b_user表中插入2条数据 #创建存储过程 delimiter $ create procedure pro_insert() begin insert into...;$ #调用存储过程 call pro_insert(); 创建带有in模式参数的存储过程 代码实例: 用于向b_user表中插入2条数据,性别由客户输入 #创建存储过程 delimiter $ create...procedure pro_insert2(in sex char(1)) begin insert into b_user(name,sex) values('存储过程a',sex); insert...存储过程名称; 查看存储过程 语法: show create procedure 存储过程名称; 修改存储过程 目前,MySQL还不提供对已存在的存储过程的代码修改。

    14.4K10

    mysql存储过程

    注意:每执行一句sql语句,就会连接mysql服务器一次。 3)“存储过程的含义”:一组预先编译好的sQL语句的集合。...3)delimiter定义存储过程的结束标记   在mysql语句中,由于每一个语句后面必须要;结尾,而存储过程也需要一个符号结尾,为了防止混淆,我们需要在创建存储过程之前,先使用delimiter定义一个存储过程的结束标记...delimiter $ 4)存储过程的调用 call 存储过程名(实参列表); 3、空参的存储过程 注意:“存储过程的整个执行过程,最好在CMD窗口中执行” -- 创建一个存储过程 delimiter...$ create procedure myp() begin insert into admin(username,`password`) values ("tom","1111")...insert into admin(username,`password`) values (username,userpwd); end $ -- 调用存储过程 call pro1

    14.7K10

    mysql存储过程

    MySQL存储过程 14.1.1 创建存储过程 MySQL中,创建存储过程的基本形式如下: 1.CREATEPROCEDUREsp_name([proc_parameter[,...]]) 2....参数指定存储过程的参数类型,该类型可以是MySQL数据库的任意数据类型。...技巧:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是,如果存储过程中没有使用SQL语句,最好设置为NO SQL。...而且,存储过程中最好在COMMENT部分对存储过程进行简单的注释,以便以后在阅读存储过程的代码时更加方便。 【示例14-1】 下面创建一个名为num_from_employee的存储过程。...以后就可以调用这个存储过程,数据库中会执行存储过程中的SQL语句。 说明:MySQL中默认的语句结束符为分号(;)。存储过程中的SQL语句需要分号来 结束。

    3K10

    Mysql存储过程

    存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件。虽然他们的作用不仅限于批处理。  ...许多数据库管理员限制存储过程的创建,允许用户使用存储过程,但不允许创建存储过程  存储过程是非常有用的,应该尽可能的使用它们  执行存储过程 MySQL称存储过程的执行为调用...BEGIN和END语句用来限定存储过程体,过程体本身是个简单的SELECT语句  在MYSQL处理这段代码时会创建一个新的存储过程productpricing。没有返回数据。...因为这段代码时创建而不是使用存储过程。 Mysql命令行客户机的分隔符  默认的MySQL语句分隔符为分号 ; 。Mysql命令行实用程序也是 ; 作为语句分隔符。...关键字OUT指出相应的参数用来从存储过程传给一个值(返回给调用者)。MySQL支持IN(传递给存储过程)、OUT(从存储过程中传出、如这里所用)和INOUT(对存储过程传入和传出)类型的参数。

    8.6K30

    Mysql存储过程

    简介 存储过程就是一条或者多条SQL语句的集合,可以视为批文件。它可以定义批量插入的语句,也可以定义一个接收不同条件的SQL。 存储函数与存储过程本质上是一样的,都是封装一系列SQL语句,简化调用。...基础入门 本文基于mysql5.7以上版本 创建存储过程的语句为CREATE PROCEDURE,创建存储函数的语句为CREATE FUNCTION。调用存储过程的语句为CALL。...对于存储过程提供的临时变量而言,MySQL规定要加上@开头。...变量定义 如果希望MySQL执行批量插入的操作,那么至少要有一个计数器来计算当前插入的是第几次。这里的变量是用在存储过程中的SQL语句中的,变量的作用范围在BEGIN .... END 中。...MySQL游标是敏感的。 您可以在存储过程,存储函数和触发器中使用MySQL游标。

    9.2K30

    MySQL 存储过程

    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数...存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升 一、存储过程概述 1.1、什么是存储过程 存储过程是数据库中的一个重要对象。...存储过程是在数据库系统中,一组为了完成特定功能的SQL 语句集。存储过程是存储在数据库中,一次编译后,到处运行。不需要再次编译,用户通过指定存储过程的名字并传递参数(如果该存储过程带有参数)来执行。...存储过程可以被重复使用。 存储过程只连接一次数据库,sql语句在访问多张表时,连接多次数据库。 存储的程序是安全的。存储过程的应用程序授予适当的权限。...'每5秒插入一次' do begin insert into emp_log values(null,1,'insert1',now()); end; #do call 存储过程 #do select

    41.5K20

    MySQL存储过程

    2、简化操作 1-2、语法: CREATE PROCEDURE 存储过程名(参数列表) BEGIN 存储过程体(一组合法的SQL语句) END 注意: 1、参数列表包含三部分 参数模式 参数名...存储过程的结尾可以使用 delimiter 重新设置 语法: delimiter 结束标记 案例: delimiter $ 二、存储过程创建和使用语法 2-1、语法 CALL 存储过程名(实参列表);...BEGIN INSERT INTO admin(username,`password`) VALUES('john1','0000'),('lily','0000'),('rose'...语法:drop procedure 存储过程名 DROP PROCEDURE p1; #错误演示,不支持批量删除 DROP PROCEDURE p2,p3 四、查看存储过程的信息 语法:show...create procedure 存储过程名 SHOW CREATE PROCEDURE p1; #错误演示 DESC p1; 存储过程案例 #一、创建存储过程实现传入用户名和密码,插入到admin

    12.7K10

    Mybatis批量插入与存储过程批量插入

    除了传统的Mybatis映射文件中的批量插入外,还可以利用存储过程来实现批量插入。本文就来讲解一下Mybatis常用的几种批量插入方式,以及重点介绍存储过程插入。1....利用存储过程批量插入存储过程接下来重点介绍利用存储过程批量插入。存储过程是存储在数据库中的一组为了完成特定功能的SQL语句集,用户通过指定存储过程的名字和参数(如果有)来调用并执行它。...使用存储过程进行批量插入可以减少与数据库的交互次数,提高性能。在上面的示例中,你已经展示了如何使用存储过程来批量插入数据。...存储过程idata和proc_initData分别用于向表t2和oms_order中插入数据。在存储过程中,你可以使用循环结构(如WHILE循环)来迭代插入数据。...案例代码接下来就用实例代码,演示如何进行使用存储过程进行批量插入,首先准备表结构-- 创建表CREATE TABLE `t2` (    `id` INT ( 11 ) NOT NULL,    `a`

    1.9K10

    【MySQL】存储过程

    文章目录 为什么使用存储过程 书写基本格式 关于参数 存储过程中开启事务 返回多个结果集 设置变量 存储过程:一段SQL语句的集合 为什么使用存储过程 1、解耦合。...可能一项业务,需要先插入、再修改、再删除、再查询返回结果,本来四条命令,谁来写先不说,这四条命令哪条单拎出来不比一条存储过程调用命令长。 3、执行速度快。...但是存储过程只需要一次编译,多次运行。 4、提高系统安全性。存储过程可以使用权限控制,而且参数化的存储过程可以有效防止注入攻击,保证了其安全性。 5、重用性强。一次编写,随处调用。...书写基本格式 create procedure 存储过程名(参数列表) begin 存储过程体 end 示例: delimiter $  #将语句的结束符号从分号;临时改为$(可以是自定义) create...后面整批量插入的时候应该要用到,用到再补吧。

    9.7K30

    mysql存储过程

    CONCAT(person_no,"号犯人住", i , "号床位"); ---字符串拼接 存储过程的创建标准 DELIMITER $$ -- 定义语句结束符 为$$ DROP PROCEDURE IF...的存储过程中经常会看到这句话:DECLARE countinue handler for NOT FOUND。...SQL SECURITY DEFINER:表示执行存储过程中的程序是由创建该存储过程的用户的权限来执行。...SQL SECURITY INVOKER:表示执行存储过程中的程序是由调用该存储过程的用户的权限来执行。...存储方法 存储方法与存储过程的区别 1,存储方法的参数列表只允许IN类型的参数,而且没必要也不允许指定IN关键字 2,存储方法返回一个单一的值,值的类型在存储方法的头部定义 3,存储方法可以在SQL语句内部调用

    10.1K10
    领券