【mysql学习四】——批量导入sql语句脚本模板

版权声明:欢迎访问,本文为小编原创文章 https://blog.csdn.net/changyinling520/article/details/81020139

前言

工作中总有需要创建一系列的假数据进行系统的功能或者是性能的测试,作为一名专业的开发者,学会批量导入数据脚本是基本功!

内容

总结篇:

前提注意:
在创建函数之前需要开启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


1.创建随机字符串:

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 <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 $$

2.创建一个随机的int值;

DELIMITER $$
/*创建随机五位数*/
CREATE FUNCTION rand_num() returns int(5)
   BEGIN
      DECLARE i int default 0;
      SET i = FLOOR(100+RAND()*10);
      RETURN i;
 END $$

3.创建万能的批量导入的存储过程:

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 $$

实践篇(工具xsheel):

创建部门和员工表:

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)

【总结】

总结可以减少下一次遇到同样问题解决的时间。感谢浏览,希望对你有帮助!

阅读更多

扫码向博主提问

常银玲-Judy

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Java
  • Angular
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页