存储过程无return,需要单独执行。
存储函数有return,可以随处调用。
1、创建部门表(dept)和员工表(emp)
# 创建数据库
create database testdata;
use testdata;
# 创建部门表
create table dept(
dno int(5) primary key default 0,
dname varchar(20) not null default '',
loc varchar(30) default ''
) engine = innodb default charset = utf8;
# 创建员工表
create table emp(
eid int(5) primary key,
ename varchar(20) not null default '',
job varchar(20) not null default '',
dno int(5) not null default 0
)engine = innodb default charset = utf8;
2、创建存储函数
randstring(6)获取 6个随机英文字母模拟员工姓名。
# 以该符号$为结束符
delimiter $
# 创建存储函数,参数为n,类型为int(参数在前类型在后),将其返回
create function randstring(n int) returns varchar(255)
# 函数开始
begin
# 定义字符串常量52个英文字母大小写
declare all_str varchar(100) default 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
# 定义员工姓名返回值
declare return_str varchar(255) default '';
# 定义i默认为0
declare i int default 0;
# 循环拼接姓名
while i < n
do
# 设置返回值,concat(要拼接的字符串,要追加到该字符串的值),substring(要截取的字符串,截取的下标/默认从1开始,每次截取的长度)
# FLOOR:强制转换,rand():随机数(相当于random())
set return_str = concat(return_str, substring(all_str, FLOOR(rand() * 52 + 1), 1));
# 将i加一(i++)
set i = i + 1;
# 结束循环
end while;
return return_str;
# 结束函数
end $
产生两位随机数,用于插入员工表的部门编号字段。
# 以该符号$为结束符
delimiter $
# 创建一个存储函数,并返回一个整数
create function ran_num() returns int(5)
begin
# 定义i变量,默认值为0
declare i int default 0;
# 获取两位随机数并转换为整型
set i = floor(rand() * 100);
return i;
end $
3、创建存储过程
通存储过程插入海量数据:emp表
delimiter $
# 创建存储过程
create procedure insert_emp(in eid_start int(10), in data_times int(10))
begin
declare i int default 0;
# 关闭自动提交
set autocommit = 0;
# 循环
repeat
# 循环批量插入数据(编号i++,姓名(5位英文), 工作, 部门编号(5位数随机数))
insert into emp values(eid_start + i, randstring(5), 'other', ran_num());
# i++
set i = i + 1;
# 循环结束条件
until i = data_times
end repeat;
commit;
end $
通过存储过程插入海量数据:dept表
delimiter $
# 定义插入dept表的存储过程,参数为编号起始数,插入总条数
create procedure insert_dept(in dno_start int(10), in dno_times int(10))
begin
declare i int default 0;
# 关闭自动提交
set autocommit = 0;
# 循环
repeat
# 插入数据到dept
insert into dept values(dno_start + i, randstring(6), randstring(8));
set i = i + 1;
# 循环结束条件
until i = dno_times
end repeat;
commit;
end $
4、调用存储过程插入海量数据
这个时候需要等待一段时间,很快啊,这波。
# 切换结束符号为";"
delimiter ;
# 调用方法进行插入800000条数据
call insert_emp(1000, 800000);
call insert_dept(10, 30);
最终,成功的插入emp表80万条数据,dept表30条。
参考链接:https://www.bilibili.com/video/BV1es411u7we?p=19