要實現插入百萬級隨機數據需要依賴MySQL的函數和存儲過程
下面先講講函數和存儲的區別:
標識符不同
函數必須要有返回值,而過程沒有返回值
過程無返回值類型,不能將結果直接賦值給變量;函數有返回值類型,調用時,除在select中,必須將返回值賦給變量
函數可以在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數據,就不插入太多了,感興趣可以自己試試,下面是結果
結果1
結果2
原文鏈接:
https://blog.csdn.net/qq_42654484/article/details/99618000