Mysql手写脚本实现插入百万级随机测试数据

要实现插入百万级随机数据需要依赖mysql的函数和存储过程

下面先讲讲函数和存储的区别:

  1. 标识符不同
  2. 函数必须要有返回值,而过程没有返回值
  3. 过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量
  4. 函数可以在select语句中直接使用,而过程不能,函数是使用select调用,过程使用call调用

一. 新建两张表:

#员工表
create table emp(
id int unsigned primary key auto_increment,
ename varchar(20) not null default "",
age int not null default 18,
deptno mediumint unsigned not null default 0
)engine=innodb default charset=utf8mb4;
#部门表
create table dept(
id int unsigned primary key auto_increment,
deptno mediumint unsigned not null default 0,
dname varchar(20) not null default ""
)engine=innodb default charset=utf8mb4;

二. 编写函数实现数据的随机性:

#随机字母函数
delimiter $$
create function rand_string(n int) returns varchar(255)
begin 
	declare chars_str varchar(100) default 'qwertyuiopasdfghjklzxvcbnm';
	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()*26),1));
	set i = i +1;
end while;
return return_str;
end $$

rand_string函数截取了n次chars_str的随机位数上的一位字符,并使用concat函数拼接到return_str(floor用来向下取整)

#随机数字函数
delimiter $$
create function rand_num() returns int(5)
begin 
	declare i int default 0;
	set i = floor(rand()*10);
	return i;
end $$
#随机年龄函数
delimiter $$
create function rand_age() returns int(5)
begin 
	declare i int default 0;
	set i = floor(18+rand()*23);
	return i;
end $$

这两个函数就不多赘述了

三.编写存储过程实现数据插入

#插入emp存储过程
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin 
	declare i int default 0;
	set autocommit = 0;
	repeat
	set i = i + 1;
	insert into emp(empno,ename,age,deptno) values(start+i),rand_string(6),rand_age(),rand_num());
	until i = max_num
end repeat;
commit;
end $$

根据传入的start控制插入数据位置,max_num控制最大插入数据,插入时调用上面写的随机函数

#插入dept存储过程
delimiter $$
create procedure insert_dept(in start int(10),in max_num int(10))
begin 
	declare i int default 0;
	set autocommit = 0;
	repeat
	set i = i + 1;
	insert into dept(deptno,dname) values((start+i),rand_string(10));
	until i = max_num
end repeat;
commit;
end $$

定义了函数或存储过程后记得deleimiter ; 把结束符改回 ;
接下来使用call [procedurename]调用存储过程就ok了,测试插入了100条emp和10条dept数据,就不插入太多了,感兴趣可以自己试试如果下面是结果
emp表
dept表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值