• mysql应用之通过存储过程方式批量插入数据


    我们平时的测试过程中有一个环节就是准备测试数据,包括准备基础数据,准备业务数据,使用的场景包括压力测试,后台批量数据传输,前端大数据查询导出,或者分页打印等功能,准备测试数据我们通俗点讲就是造数据,根据不同的使用场景我们有不同的造数据的方式,比如需要大数据时我们可以用jmeter压测获取大数据,也可以导入生产数据,简单少许的测试数据我们直接在数据库中插入,本篇主要记录的是另外一种造数据的方式——通过编写存储过程来实现批量数据插入。

    一、编写调用存储过程:

    数据库类型:mysql 

    需求:在user表中插入数据,user表主键为id,id方式为长度为32位的字母+数字随机字符串

    1、创建存储过程

     1 DELIMITER $$
     2 USE `db_test`$$
     3 DROP PROCEDURE IF EXISTS `proc_user`$$
     4 
     5 CREATE DEFINER=`root`@`%` PROCEDURE `proc_user`()
     6 BEGIN
     7    DECLARE user_name VARCHAR(60);
     8    DECLARE email VARCHAR(150);
     9    DECLARE rand_id VARCHAR(120);
    10    DECLARE id VARCHAR(120);
    11    DECLARE i INT DEFAULT 1000;
    12    DECLARE createtime DATETIME;
    13    DECLARE tel_body VARCHAR(40);
    14    DECLARE tel VARCHAR(60);
    15    -- 调试过程, 先插入5条
    16    WHILE i <= 1005 DO
    17      -- user_name = test + i
    18      SET user_name = CONCAT('test', i);
    19      SET email = CONCAT(user_name,'@qq.com');
    20      SET rand_id= SUBSTRING(MD5(RAND()),1,28);
    21      -- id = rand_id + i, +i的目的主要是为了区分测试数据与user_name对应
    22      SET id = CONCAT(rand_id, i);
    23      SET createtime = NOW();
    24      SET tel_body = FLOOR(RAND()*100000000);
    25      -- tel = 159开头随机号码
    26      SET tel = CONCAT('159', tel_body);
    27 
    28      INSERT INTO  `user`
    29      VALUES(id,
    30        user_name, 
    31       '202cb962ac59075b964b07152d234b70', 
    32       '0cc495f78776486294ebc7c08831aabe', 
    33       NULL,
    34       createtime,
    35       tel,
    36       email
    37       );
    38      SET i=i+1;
    39      END WHILE;
    40 END$$
    View Code

    2、调用存储过程

    1 CALL `proc_user`();
    View Code

    3、查看表数据

    4、模拟批量插入5000条数据,

    1)调用存储过程,全部数据插入完成耗时如下:

    2)核对数据库插入数据总量

    二、上述方法是将插入记录数作为一个固定值,直接写在存储过程中,其实还可以设置参数,调用存储过程时传递需要插入的记录行数,如下:

     1 -- 传参数的方法
     2 DELIMITER $$
     3 USE `db_test`$$
     4 DROP PROCEDURE IF EXISTS `proc_user`$$
     5 
     6 CREATE DEFINER=`root`@`%` PROCEDURE `proc_user`(IN cn INT(4))
     7 BEGIN
     8    DECLARE user_name VARCHAR(60);
     9    DECLARE email VARCHAR(150);
    10    DECLARE rand_id VARCHAR(120);
    11    DECLARE id VARCHAR(120);
    12    DECLARE i INT DEFAULT 1000;
    13    DECLARE createtime DATETIME;
    14    DECLARE tel_body VARCHAR(40);
    15    DECLARE tel VARCHAR(60);
    16    -- 判定条件,i<=cn则插入
    17    WHILE i <= cn DO
    18      SET user_name = CONCAT('test', i);
    19      SET email = CONCAT(user_name,'@qq.com');
    20      SET rand_id= SUBSTRING(MD5(RAND()),1,28);
    21      SET id = CONCAT(rand_id, i);
    22      SET createtime = NOW();
    23      SET tel_body = FLOOR(RAND()*100000000);
    24      SET tel = CONCAT('159', tel_body);
    25 
    26      INSERT INTO  `user`
    27      VALUES(id,
    28        user_name, 
    29       '202cb962ac59075b964b07152d234b70', 
    30       '0cc495f78776486294ebc7c08831aabe', 
    31       NULL,
    32       createtime,
    33       tel,
    34       email
    35       );
    36      SET i=i+1;
    37      END WHILE;
    38 END$$
    39 
    40 -- 传参数的方法CALL `proc_user`(cn); -- cn为任意大于1000小于9999的数值
    41 CALL `proc_user`(1100);
    View Code

    三、函数简要解释: 

    1、CONCAT()函数:

         拼接函数,将多个字符串拼接成一个字符串,语法为:CONCAT(str1,str2,…)

    2、RAND()函数,FLOOR()函数:

         RAND(),0-1之间的随机数,带小数点

        

         FLOOR(),取整;

         FLOOR(RAND() *10),获得0-10之间的整数(包含0,不包含10);FLOOR(RAND() *100000000),获取10000000-99999999之间的随机整数

        

    3、SUBSTRING()函数:

         截取子字符串函数,从特定位置开始的字符串返回一个给定长度的子字符串

         语法:SUBSTRING(字符串,位置,长度),如SUBSTRING(MD5(RAND()),1,28),从MD5随机字符串的第1位开始截取长度为28位的子字符串

  • 相关阅读:
    广告电商系统开发功能和源码分享
    定义curl方法 请求接口传输post值,设置header值
    php json保存为utf8
    超越自卑(阿德勒)阅读笔记
    最近的一些事
    BN.2021.1007.1131.简明的Tensorflow2.0
    RX.2021.1004.1546.三维重建.单张图获取深度信息
    RX.2021.1004.1544.图像配准.基于VoxelMorph的脑部MRI配准
    RX.2021.0909.1408.图像分割.基于UNet的OCT血管分割
    RX.2021.0903.1118.图像去噪.基于自监督深度学习的神经活动荧光图像去噪
  • 原文地址:https://www.cnblogs.com/simple1025/p/11297284.html
Copyright © 2020-2023  润新知