MySQL通过存储函数和存储过程插入80万条数据

存储过程无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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值