要實(shí)現(xiàn)插入百萬(wàn)級(jí)隨機(jī)數(shù)據(jù)需要依賴MySQL的函數(shù)和存儲(chǔ)過(guò)程
下面先講講函數(shù)和存儲(chǔ)的區(qū)別:
標(biāo)識(shí)符不同
函數(shù)必須要有返回值,而過(guò)程沒(méi)有返回值
過(guò)程無(wú)返回值類型,不能將結(jié)果直接賦值給變量;函數(shù)有返回值類型,調(diào)用時(shí),除在select中,必須將返回值賦給變量
函數(shù)可以在select語(yǔ)句中直接使用,而過(guò)程不能,函數(shù)是使用select調(diào)用,過(guò)程使用call調(diào)用
一. 新建兩張表:
#員工表
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;
二. 編寫函數(shù)實(shí)現(xiàn)數(shù)據(jù)的隨機(jī)性:
#隨機(jī)字母函數(shù)
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函數(shù)截取了n次chars_str的隨機(jī)位數(shù)上的一位字符,并使用concat函數(shù)拼接到return_str(floor用來(lái)向下取整)
#隨機(jī)數(shù)字函數(shù)
delimiter $$
create function rand_num() returns int(5)
begin
declare i int default 0;
set i = floor(rand()*10);
return i;
end $$
#隨機(jī)年齡函數(shù)
delimiter $$
create function rand_age() returns int(5)
begin
declare i int default 0;
set i = floor(18+rand()*23);
return i;
end $$
這兩個(gè)函數(shù)就不多贅述了
三.編寫存儲(chǔ)過(guò)程實(shí)現(xiàn)數(shù)據(jù)插入
#插入emp存儲(chǔ)過(guò)程
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 $$
根據(jù)傳入的start控制插入數(shù)據(jù)位置,max_num控制最大插入數(shù)據(jù),插入時(shí)調(diào)用上面寫的隨機(jī)函數(shù)
#插入dept存儲(chǔ)過(guò)程
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 $$
定義了函數(shù)或存儲(chǔ)過(guò)程后記得deleimiter ; 把結(jié)束符改回 ;
接下來(lái)使用call [procedurename]調(diào)用存儲(chǔ)過(guò)程就ok了,測(cè)試插入了100條emp和10條dept數(shù)據(jù),就不插入太多了,感興趣可以自己試試,下面是結(jié)果
結(jié)果1
結(jié)果2
原文鏈接:
https://blog.csdn.net/qq_42654484/article/details/99618000






