使用存储过程构造测试数据

本贴最后更新于 787 天前,其中的信息可能已经时异事殊

存储过程创建测试数据

1、怎么创建测试数据
如果你会编程语言,那么你可以使用java、python、php等等语言通过对应的工具包操作数据库来完成测试数据的构建。
如果你不会这些语言,恰好你又会一些sql语句,使用存储过程完成测试数据构造是再好不过了。
并且存储过程就是sql脚本,存储、执行、查看结果都在一个工具类就可完成非常方便。(本例采用mysql数据库)
2、什么是存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,
一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
简单理解:完成特定功能的方法
2、表结构
首先我们先来查看下需要插入测试数据的表member,表中存放的是用户信息。

image.png

3、mysql内置函数
通过上图我们已经知道了member表结构,其中RegName用户名一般会不允许重复,我们需要使用一些随机的或者有规律的字符串。
还有手机号码和注册时间这些都不是固定值,所以需要借助mysql中的内置函数:

CONCAT(str1,str2,...png) 拼接多个字符串

select CONCAT("test",1);
结果:
test1

MD5(str) md5加密

select md5(123456);
结果:
e10adc3949ba59abbe56e057f20f883e

RAND() 生成一个0-1之间的随机数

select RAND();
结果:
0.70196044510413

NOW()获取当前时间

select NOW();
结果:
2019-09-23 16:15:06
4、编写存储过程

首先我们先把对member的插入语句写好,之后写存储过程就在这个基础上进行修改

insert into member values(null,'test_1',MD5(123456),18900000000,1,0,NOW());

结果:

image.png

OK,现在已经成功插入一条数据,接下来我们通过存储过程完成10000条数据的插入。

#创建一个名为 CrateTestData()的存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `CrateTestData`()
#存储过程从BEGIN开始END结束
BEGIN											
	 #用declare定义一个int类型的变量i初始值为1
	 declare i int default  1;
	 /*    因为我们需要造10000条数据,肯定需要循环执行插入语句,所以先给大家介绍while循环
		while循环语法:
			while 条件 DO
				循环体;
			end while;
   	 */
	 #如果 i 小于10000 那么就继续循环,否则跳出循环
	 while i < 10000 do
		#插入语句,对用户名做了拼接,对密码进行md5加密,对手机号码、余额进行随机处理,注册日期是当前时间 
		insert into member values
		(null,CONCAT('test_',i),MD5(123456),18900000000+i,1,RAND()*100000,NOW());
		#每insert一次i就加一,不然无法跳出循环
		set  i = i +1;
	 end while;
END

最后执行存储过程

call CrateTestData();

结果如下
image.png

1 操作
luojie 在 2020-08-06 17:40:40 更新了该帖
5 回帖
请输入回帖内容 ...
  • bottle_7

    没用,太奇怪了,就那行加了分号就当行报错,不加就下一行报错?不着急吧,老师慢慢看

    CREATE DEFINER=root@localhost PROCEDURE CrateTestData()
    BEGIN
    declare i int default 1;
    while i < 10000 do
    insert into member values
    (null,CONCAT('test_',i),MD5(123456),13517793136+i,1,RAND()*10000,NOW());
    set i = i +1;
    end while;
    END
    CALL crateTestData();

    image.png

  • 其他回帖
  • luojie

    declare i int default 1; 你缺少了分号

  • bottle_7

    你好罗杰老师,请过目一下,看看是问题出在哪吧,我只不过改成插入了1000条数据而已,如果是固定10000也不行,前面的单条数据倒是插入成功,剩下的或许是我哪里理解错了吧,麻烦老师了
    image.png
    单条数据顺利插入
    image.png

  • bottle_7

    很抱歉,试过了,还是不行,不知道是不是那个很细的细节问题,后来我试着用最懒的方法复制老师的代码直接粘贴过去,居然还是不行,
    image.png

  • 查看更多回帖