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

猜你喜欢

转载自www.cnblogs.com/qiaoli0726/p/9230364.html