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