zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    TDD测试驱动开发
    力导向算法研究
    简单软件破解入门
    学习Go语言之模板方法模式
    学习Go语言之观察者模式
    学习Go语言之使用channel避免竞态问题
    学习Go语言之使用原子访问或互斥锁解决竞态问题
    使用 Beego 搭建 Restful API 项目
    学习Go语言之抽象工厂模式
    [转载]几张图看懂区块链技术到底是什么?
  • 原文地址:https://www.cnblogs.com/qiaoli0726/p/9230364.html
Copyright © 2011-2022 走看看