MySQL高级--批量插入数据脚本

  1. 建表
    • 部门表:
    • CREATE TABLE dept(

      id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT ,

      deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,

      dname VARCHAR(20) NOT NULL,

      loc VARCHAR(13) NOT NULL DEFAULT ''

      ) ENGINE= INNODB DEFAULT CHARSET=GBK;

    • 员工表:
    • 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=GBK ;

  1. 设置参数log_bin_trust_function_creators
    • 创建函数,假如报错: This function has none oflDETERMINISI.....

    • 由于开启过慢查询日志,因为我们开启了bin-log, 我们就必须为我们的function指定一个参数。
      show variables like 'log_bin_trust_function_creators';
      set global log_bin_trust_function_creators=1;

    • 这样添加了参数以后,如果mysqld重启,上述参数又会消失, 永久方法:
      windows下my.ini[mysqld]加上log_bin_trust_function_creators=1
      linux下/etc/my.cnf 下my.cnf[mysqld]加上log_bin_trust_function_creators=1

  2. 创建函数,保证每条数据都不行同
    • 随机产生字符串的函数:

       

    • DELIMITER $
      CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
      BEGIN
      DECLARE chars_str VARCHAR(100) DEFAULT 'abcde fghij klmnopqrs tuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ' ;
      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 $ 
  3. 创建存储过程
    • 创建向emp表中插入数据的存储过程
      • DELIMITER $$
        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;
        END $$

          
    • 创建向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 $$

            
  4. 调用存储过程
    1. 调用insert_dept存储过程:call insert_dept(100,10);

      •   
    2. 调用insert_emp存储过程:call insert_emp(10,10);
      •  

         

            
posted @ 2021-05-18 20:14  张紫韩  阅读(128)  评论(0编辑  收藏  举报