创建一个存储过程,模拟插入百万数据

#创建存储过程
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1  
BEGIN   
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';   
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()*62 ),1));   
SET i = i +1;   
END WHILE;   
RETURN return_str;   
END


#制定规则
CREATE  PROCEDURE `add_t_dws_dt_yd_sswgrs2`(IN n int)  
BEGIN    
  DECLARE i INT DEFAULT 1;  
    WHILE (i <= n ) DO  
      INSERT into t_dws_dt_yd_sswgrs  (gridRealtimeStatistics,lng,lat,updateTime ) VALUEs (FLOOR(RAND() * 1000),FLOOR(RAND() * 100),FLOOR(RAND() * 100) ,now() );  
            set i=i+1;  
    END WHILE;  
END 


调用存储过程
CALL add_t_dws_dt_yd_sswgrs2(1000) 


插入调用的存储过程的表
INSERT into vote_record SELECT * from  vote_record_memory 

 

#创建部门表
CREATE TABLE `dept` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `deptName` VARCHAR(30) DEFAULT NULL,
 `address` VARCHAR(40) DEFAULT NULL,
 `ceo` INT NULL ,
 PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
#创建员工表
CREATE TABLE `emp` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `empno` INT NOT NULL ,
 `name` VARCHAR(20) DEFAULT NULL,
 `age` INT(3) DEFAULT NULL,
 `deptId` INT(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
 #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

1.1    设置参数:log_bin_trust_function_creators

创建函数,假如报错:This function has none of DETERMINISTIC......
# 由于开启过慢查询日志bin-log, 我们就必须为我们的function指定一个参数。
#主从复制,主机会将写操作记录在bin-log日志中。从机读取bin-log日志,执行语句来同步数据。
#如果使用函数来操作数据,会导致从机和主键操作时间不一致。所以,默认情况下,mysql不开启创建函数设置
#查看mysql是否允许创建函数:
show variables like 'log_bin_trust_function_creators';
#命令开启:允许创建函数设置:
set global log_bin_trust_function_creators=1; 
# 不加global只是当前窗口有效。mysqld重启,上述参数又会消失。
#永久方法:
•    windows下:my.ini[mysqld]加上:log_bin_trust_function_creators=1  
•    linux下:/etc/my.cnf下my.cnf[mysqld]加上:log_bin_trust_function_creators=1

1.2     创建函数,保证每条数据都不同
随机产生字符串

DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN    
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
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 ;
drop function rand_string;

随机产生部门编号
#用于随机产生多少到多少的编号

DELIMITER $$
CREATE FUNCTION  rand_num (from_num INT ,to_num INT) RETURNS INT(11)
BEGIN   
DECLARE i INT DEFAULT 0;  
SET i = FLOOR(from_num +RAND()*(to_num - from_num+1))   ;
RETURN i;  
END$$ 
 
#假如要删除
DELIMITER ;
drop function rand_num;

1.3    创建存储过程
创建往emp表中插入数据的存储过程

DELIMITER $$
CREATE PROCEDURE  insert_emp(  START INT ,  max_num INT )
BEGIN  
DECLARE i INT DEFAULT 0;   
 SET autocommit = 0;    #设置手动提交事务
 REPEAT  #循环
 SET i = i + 1;  #赋值
 INSERT INTO emp (empno, NAME ,age ,deptid ) VALUES ((START+i),rand_string(6),rand_num(30,50),rand_num(1,10000));  
 UNTIL i = max_num  
 END REPEAT;  
 COMMIT;  #提交事务
END$$
 
#删除
DELIMITER ;
drop PROCEDURE insert_emp;


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

#执行存储过程,往dept表添加随机数据
DELIMITER $$
CREATE PROCEDURE `insert_dept`(  max_num INT )
BEGIN  
DECLARE i INT DEFAULT 0;   
 SET autocommit = 0;    
 REPEAT  
 SET i = i + 1;  
 INSERT INTO dept ( deptname,address,ceo ) VALUES (rand_string(8),rand_string(10),rand_num(1,500000));  
 UNTIL i = max_num  
 END REPEAT;  
 COMMIT; 
END$$
 
#删除
DELIMITER ;
drop PROCEDURE insert_dept;

1.4     调用存储过程
Dept
 #执行存储过程,往dept表添加1万条数据
CALL insert_dept(10000); 
Emp
#执行存储过程,往emp表添加50万条数据
CALL insert_emp(100000,500000); 

 

posted @ 2020-09-04 11:38  我是深水的猫  阅读(688)  评论(0)    收藏  举报