qiaoli0726

mysql存储过程批量插入数据方法

最近需要往库表插入批量数据,所以写了个存储过程函数,以下分享学习心得。因为项目是接口,当然造数据我们可以用jmeter或者LoadRunner写好脚本往数据库压数据

1:参考文档:https://www.cnblogs.com/wt645631686/p/6868192.html

2:参考文档:https://www.cnblogs.com/kenshinobiy/p/9194147.html

一:存储过程简介

SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

二:MySQL存储过程语法

 

2.1:语法:CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体

 

语法实例CREATE PROCEDURE `proc_auto_insertdata`(in start int)

BEGIN

DECLARE num INTEGER ;

END;

 

参数解析:参数

存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

  • IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT:该值可在存储过程内部被改变,并可返回
  • INOUT:调用时指定,并且可被改变和返回

    过程体

    过程体的开始与结束使用BEGIN与END进行标识。

2.2:变量

语法:DECLARE 变量名1[,变量名2...] 数据类型 [默认值];

2.3:变量赋值

 

语法:SET 变量名 = 变量值 [,变量名= 变量值 ...]

2.4:用户变量

 

用户变量一般以@开头

 

2.5:存储过程调用

用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。

三:实例

1:往order表批量插入数据,写了一个流水号生成函数,在存储过程中调用该函数,拼接流水

运行截图:

 

#生成流水号函数
create function rand_num( )
returns int(5)
begin
 declare i int default 0;
 set i = floor(10+rand()*500);
    #set i = CEIL(RAND() * 9000000000) + 1000000000;
return i;
end;


DROP PROCEDURE IF EXISTS `proc_auto_insertdata`;
CREATE PROCEDURE `proc_auto_insertdata`()
BEGIN
    DECLARE num INTEGER ;
    DECLARE order_no  varchar(32);
    DECLARE trans_code  varchar(32);
    DECLARE out_order_no  varchar(32);

#set autocommit = 0  //把autocommit设置成0,这样可以只提交一次,否则。。。。。
    set num=1;
    set order_no=2018062600000;
    set trans_code=870210;
    set out_order_no=201806260000000;

    START TRANSACTION;
    WHILE num <=2 DO
        set order_no=order_no+1;
        set out_order_no=out_order_no+1;
        INSERT INTO `epay`.`orders` (`order_no`, `user_no`, `trans_code`, `out_order_no`, `out_date_time`, `origional_order_no`, `mer_no`, `payer_name`, `payer_no`, `payer_acct_no`, `payer_acct_type`, `channel_flag`, `pay_serial_id`, `pay_amount`, `currency`, `busi_date`, `trans_fee`, `fee_currency`, `recv_name`, `recv_no`, `recv_branch_no`, `recv_account_no`, `recv_acct_type`, `recv_type`, `realtime_type`, `order_type`, `agent_order_type`, `detail_flag`, `in_account_date`, `order_desc`, `prod_code`, `prod_name`, `pay_type`, `assoc_no`, `in_out_flag`, `channel_name`, `order_status`, `create_time`, `update_time`, `end_time`, `sys_order_flag`, `receive_url`, `pickup_url`, `sms_confirm`, `order_valid_time`, `scan_flag`, `memo`, `extfld1`, `extfld2`, `extfld3`)
        VALUES (CONCAT(\'order_now\',rand_num( )), NULL, trans_code, CONCAT(\'out_order_no\',DATE_FORMAT(now(),\'%Y%m%d\'),rand_num( )), \'20170103103518\', NULL, \'50000001\', NULL, NULL, NULL, NULL, \'3\', \'f7eac91b03dc4fb08595db4bdb7d688a\', \'0.01\', \'CNY\', DATE_FORMAT(now(),\'%Y%m%d\'), \'0.00\', \'CNY\', \'批量插入\', NULL, NULL, \'6214855712316351\', \'1\', \'0\', NULL, \'R\', \'1\', \'3\', NULL, \'123\', NULL, NULL, NULL, NULL, \'1\', \'YEEPAY_PAY\', \'2\', \'20170103103520\', \'20170103103527\', NULL, NULL, NULL, NULL, NULL, NULL, \'0\', \'guxw自动化用例\', NULL, \'顾夏炜,330211198807290073,15858297732,null,null,308584001547,招商银行\', NULL);

        set num =num+1;
    end WHILE;
    COMMIT ;
END;

#调用存储过程
call proc_auto_insertdata();

四:设置mysql的自动提交开关

         第一步过程写好了,本以为就可以万事大吉了,但是实际去执行这个过程,你会发现速度太慢了,一千万条数据估计得跑十几个小时。设置mysql的自动提交开关是提速的关键所在。

(1)打开命令列界面

输入命令:show variables like \'autocommit\';

(2)输入命令set autocommit = 0;
执行完命令后,我们可以看到autocommit 为OFF,说明mysql的自动提交开关已经关闭

(3)执行过程;存储过程写好, mysql的自动提交开关给关上,然后再执行过程,你会发现,一千万数据很快就能造完了。
(4)输入命令set autocommit = 1;还原mysql的自动提交开关的默认设置。
数据制造完之后一定要还原mysql的自动提交开关的默认设置,不然直接执行的所有的insert、update这样的修改语句都需要手动commit

分类:

技术点:

相关文章:

  • 2021-11-18
  • 2021-11-20
  • 2022-02-23
  • 2021-11-03
  • 2021-11-03
  • 2021-07-31
猜你喜欢
  • 2021-12-13
  • 2022-12-23
  • 2021-11-03
  • 2021-05-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案