原文 :https://www.cnblogs.com/phpper/p/7361841.html
还可参考https://segmentfault.com/q/1010000017172812
mysql使用存储过程&函数实现批量插入
写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧…正好也好加深下对procedure和function的熟练操作吧…
废话不多说,我就直接上表结构啦哈,如下:
create table dept(
id int unsigned primary key auto_increment,
deptno mediumint unsigned not null default 0,
dname varchar(20) not null default "",
loc varchar(13) not null default ""
)engine=innodb default charset=utf8;
create table emp(
id int unsigned primary key auto_increment,
empno mediumint unsigned not null default 0,/*编号*/
ename varchar(20) not null default "",/*姓名*/
job varchar(9) not null default "",/*工作*/
mgr mediumint unsigned not null default 0,/*上级编号*/
hiredate date not null,/*入职时间*/
sal decimal(7,2) not null, /*薪水*/
comm decimal(7,2) not null,/*红利*/
deptno mediumint unsigned not null default 0/*部门编号*/
)engine=innodb default charset=utf8;
执行以下命令查看mysql版本是否开启了函数功能
show variables like 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=1;
执行后再看是否生效
创建函数(作用:生产随机字符串)
delimiter $$
create function rand_string(n int) returns varchar(255)
begin
declare chars_str varchar(100) default 'qwertyuiopasdfghjklzxcvbnm';
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()*52),1));
set i=i+1;
end while;
return return_str;
end $$
创建函数(作用:随机生产部门编号)
delimiter $$
create function rand_num() returns int(5)
begin
declare i int default 0;
set i=floor(100+rand()*10);
return i;
end $$
创建完后我们可以查看创建的函数:
接着我们来创建存储过程:
1:创建往emp表中插入数据的存储过程
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
/*把autocommit设置成0*/
set autocommit= 0;
repeat
set i=i+1;
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values((start+i),rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i=max_num end repeat;
commit;
end $$
2:创建往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,loc) values((start+i),rand_string(10),rand_string(8));
until i=max_num end repeat;
commit;
end $$
可以查看已经创建的procedure:
上面2个show create procedure请分开执行,我这里直截图就只显示一个procedure啦
那我们可以开始调用存储过程了
call insert_dept(1,100);//从deptno为1起插入100条随机生成数据
执行后我的部分数据如下:
call insert_emp(1001,50000);//从empno为1001起插入50000条随机生成数据
执行后部分截图如下:
至此,整个批量插入完成…关于存储过程和函数,手册上有更详细的介绍啦,我这里就不再赘述了吧…
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。