一,建表

dept/emp

二,设置参数

log_trust_function_createors
当开启二进制日志后,如果变量log_bin_trust_function_creators为OFF,那么创建或修改存储函数就会报“ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)”这样的错误。因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。
因为我们开启了bin_log,我们必须为为我们的function指定一个参数: 步骤如下(临时)
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
SET GLOBAL log_bin_trust_function_creators=1

  1. # 临时开启
  2. show variables like 'log_bin_trust_function_creators';
  3. set global log_bin_trust_function_creators=1;
  4. # 这样添加了参数以后,如果mysqld重启,上述参数又会消失,永久方法:
  5. windowsmy.ini[mysqld]加上log_bin_trust_function_creators=1
  6. linux /etc/my.cnfmy.cnf[mysqld]加上log_bin_trust_function_creators=1

image.png

三,创建函数

1,随机产生字符串


DELIMITER $$
## 创建一个生成n位字符串的随机函数
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN    ## 方法开始
 DECLARE chars_str VARCHAR(100) DEFAULT   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; 
 ## 声明一个 字符窜长度为 100 的变量 chars_str ,默认值 
 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));
   ##concat 连接函数  ,substring(a,index,length) 从index处开始截取
   SET i = i + 1;
 END WHILE;

 RETURN return_str;
END $$

# 假如要删除
#drop function rand_string;

2,随机产生生部门编号

## 用于随机产生部门编号
DELIMITER $$
CREATE FUNCTION rand_num( ) 
RETURNS INT(5)  
BEGIN   
  DECLARE i INT DEFAULT 0;  
  SET i = FLOOR(100+RAND()*10);  
RETURN i;  
END $$


#假如要删除
#drop function rand_num;

image.png

四,创建存储过程

1,创建往user表中插入数据的存储过程

DELIMITER $$
## 创建往user表中插入数据的存储过程
CREATE PROCEDURE insert_user(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 USER (NAME, CODE, age, dept_id) VALUES (rand_string(6), (START+i), rand_num(), rand_num());  
    UNTIL i = max_num   ## 直到  上面也是一个循环
  END REPEAT;  ## 满足条件后结束循环
  COMMIT;   ## 执行完成后一起提交
 END $$

#删除
# DELIMITER ;
# drop PROCEDURE insert_user;

2,创建往dept表中插入数据的存储过程

## 执行存储过程,往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 (CODE, NAME) VALUES (START +i ,rand_string(10));  
    UNTIL i = max_num  
  END REPEAT;  
  COMMIT;  
END $$ 

## 删除
# DELIMITER ;
# drop PROCEDURE insert_dept;

image.png

五,调用存储过程

dept/user

## 执行入10个部门,Code 从100开始
DELIMITER ;
CALL insert_dept(100,10); 

## 执行存储过程,往user表添加50万条数据
DELIMITER ;    ## 将结束标志换回 ;
CALL insert_user(100001,500000);