利用存储过程造测试数据

开发过程中我们往往会遇到需要向数据库插入几千或几万条数据以测试某个功能,或者为了复现生产的某个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
②、生成指定长度的随机数字的函数
  • 按照入参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$$ 

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

3. 查看存储过程

show create procedure insert_logistics_notice

4. 调用存储过程

call insert_logistics_notice(100000);

5.删除存储过程

DROP PROCEDURE insert_logistics_notice;

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

7.参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值