• 利用存储过程造测试数据


    开发过程中我们往往会遇到需要向数据库插入几千或几万条数据以测试某个功能,或者为了复现生产的某个bug而需要在测试环境造大量的数据的需求,此时便可以通过存储过程来直接向数据库某张表里生成指定条数的测试数据!!!

    • 以往logistics_notice表里生成指定条数的数据为例做演示!!!

    1. 创建随机函数

    ①、生成指定长度的随机字符串的函数
    • 生成指定长度的随机字符串
    • 函数用完时记得删除:drop function rand_string;
    CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
    BEGIN 
    DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
    DECLARE return_str varchar(255) DEFAULT '' ;
    DECLARE i INT DEFAULT 0; 
    WHILE i < n DO 
    SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); 
    SET i = i +1; 
    END WHILE; 
    RETURN return_str; 
    END
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    ②、生成指定长度的随机数字的函数
    • 按照入参from_numto_num,生成该区间的随机数字
    DELIMITER $$
    CREATE FUNCTION  rand_num (from_num INT ,to_num INT) RETURNS INT(11)
    BEGIN   
    DECLARE i INT DEFAULT 0;  
    SET i = FLOOR(from_num +RAND()*(to_num - from_num+1))   ;
    RETURN i;  
    END$$ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.创建存储过程

    • 该存储过程中会调用上面的rand_string函数生成指定长度的随机字符串
    • 该存储过程在调用时根据传入的入参可以控制生成的数据条数
    CREATE  PROCEDURE `insert_logistics_notice`(IN n int)
    BEGIN  
      DECLARE i INT DEFAULT 1;
        WHILE (i <= n ) DO
          INSERT into logistics_notice(waybill_no,node_status_cd,node_dt,node_desc,tenant_code,is_valid,create_time,last_modified_time)
         values(concat('wenpan-1234-',i) ,1,now(),rand_string(5),'cathay',1,now(),now());
    			set i=i+1;
        END WHILE;
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. 查看存储过程

    show create procedure insert_logistics_notice
    
    • 1

    4. 调用存储过程

    call insert_logistics_notice(100000);
    
    • 1

    5.删除存储过程

    DROP PROCEDURE insert_logistics_notice;
    
    • 1

    6.问题

    创建函数,假如报错:This function has none of DETERMINISTIC…

    # 由于开启过慢查询日志bin-log, 我们就必须为我们的function指定一个参数。
    #主从复制,主机会将写操作记录在bin-log日志中。从机读取bin-log日志,执行语句来同步数据。
    #如果使用函数来操作数据,会导致从机和主键操作时间不一致。所以,默认情况下,mysql不开启创建函数设置
    #查看mysql是否允许创建函数:
    show variables like 'log_bin_trust_function_creators';
    #命令开启:允许创建函数设置:
    set global log_bin_trust_function_creators=1; 
    # 不加global只是当前窗口有效。mysqld重启,上述参数又会消失。
    #永久方法:
    •    windows下:my.ini[mysqld]加上:log_bin_trust_function_creators=1  
    •    linux下:/etc/my.cnf下my.cnf[mysqld]加上:log_bin_trust_function_creators=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    7.参考

  • 相关阅读:
    [Servlet 4]Bean与DAO设计模式
    MATLAB 的 plot 绘图
    循环队列c语言版
    GC overhead limit exceeded问题
    仿网易云音乐小程序-uniapp
    计算机毕业设计之java+ssm果蔬经营平台系统
    H5游戏开发与App游戏开发:有什么不同?
    机器学习算法系列————决策树(二)
    uniapp集成个推
    【蓝桥杯选拔赛真题31】python演讲比赛打分 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
  • 原文地址:https://blog.csdn.net/Hellowenpan/article/details/128166438