工作中总有需要创建一系列的假数据进行系统的功能或者是性能的测试,作为一名专业的开发者,学会批量导入数据脚本是基本功!
前提注意:
在创建函数之前需要开启log_bin_trust_function_creators,否则出现如下的错误:
查看log_bin_trust_function_creators
show variables like 'log_bin_trust_function_creators'
发现是关闭状态,这个参数是防止在主从复制的机器上,无法达到同步所以需要开启:暂时性开启
set global log_bin_trust_function_creators=1
永久性开启:
//window系统下:my.ini[mysqld]加上
[mysqld]
log_bin_trust_function_creators=1
//linux系统下:my.cnf[mysqld]加上
[mysqld]
log_bin_trust_function_creators=1
参考博客:
https://www.cnblogs.com/flying607/p/5576584.htm
DELIMITER $$
CREATE FUNCTION rand_string(n int) returns varchar(255)
BEGIN
DECLARE chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str varchar(255) default '';
DECLARE I INT default 0;
WHILE i 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 $$
DELIMITER $$ /*以什么分隔符*/
/*max_num表明循环添加的次数,50万条数据,就写成500000*/
create procedure insert_common(in START int(10),in max_num int(10))
begin
declare i int default 0;
/*关闭自动提交,全部成功之后一起提交*/
set autocommit =0;
REPEAT
set i=i+1;
/*自定义你的insert语句,字符串可以用上面函数rand_string,数字可以用rand_num*/
insert into 表名(字段名)values(rand_num(),rand_string())
UNTIL i=max_num
END REPEAT;
COMMIT;
END $$
Create database bigData;
use bigData;
/*部门表*/
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=gbk;
/*员工表*/
create table emp(
id int unsigned primary key auto_increment, /*员工id*/
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, /*入职日期*/
deptno mediumint unsigned not null default 0 /*部门编号*/
)engine=innodb default chharset=gbk;
create procedure insert_emp(in START int(10),in max_num int(10))
begin
declare i int default 0;
# set autocommit =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;
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 $$
mysql> call insert_dept(100,10);
Query OK, 0 rows affected (0.78 sec)
mysql> select * from dept;
+----+--------+------------+----------+
| id | deptno | dname | loc |
+----+--------+------------+----------+
| 1 | 101 | NAoTBcHcrD | PnWUHDWW |
| 2 | 102 | SBbERuznRw | FMWujOof |
| 3 | 103 | KiMjKXIvhw | MwUjoOee |
| 4 | 104 | iCmEmwuJor | QcRcKvVq |
| 5 | 105 | SrfzhoXXTz | TVXZexcR |
| 6 | 106 | eVrVBWdBwF | KMEKKymN |
| 7 | 107 | grpzDumarH | nqPeZKBB |
| 8 | 108 | eSbFUHAJTo | PfkGEcwd |
| 9 | 109 | delSIKAxKh | GIzyRQCn |
| 10 | 110 | IBKTqUDifZ | JxjBgdWx |
+----+--------+------------+----------+
10 rows in set (0.00 sec)
总结可以减少下一次遇到同样问题解决的时间。感谢浏览,希望对你有帮助!