存储过程练习-插入10万条数据-获取随机字符串

参考博客

Mysql创建一张表并且添加一万条数据
mysql存储过程,生成随机字符串
首先需要说明的是一个分隔符的问题,我们在sql中写了一大堆的sql,其中有一部分是存储过程,那么我们应该来把他们分割开来,让Mysql知道哪些是存储过程呢,很明显,我们需要一个标志来确定 存储过程的开始和结束.
使用 DELIMITER 分隔符 这样就可以定义结束.

-- ----自定义分隔符,告诉接下来执行命令 \\为结束,所以 END \\(中间有空格)才结束.
DELIMITER \\ -- 修改MySQL delimiter:'\\'

和新建表一样,我们喜欢删除存在名字冲突的

-- --- 删除存储过程
DROP PROCEDURE IF EXISTS procedureName; 
-- ----创建存储过程
-- ---- 新建 需要定义 存储过程名字为 procedureName,这里需要戴()
DELIMITER \\
CREATE
    PROCEDURE procedureName()
    BEGIN
-- ----定义变量 存储过程中需要使用的变量先定义先哈
DECLARE i INT DEFAULT 0;
-- ----使用循环,你也可以不使用,看需要
WHILE(i<=100000) DO
BEGIN
SELECT i;
SET i=i+1;
-- ---- 在循环体里面做事情
-- -- 注意:循环内容需要开始和结束
-- -- 循环本身也需要开始和结束
-- --前提是你已经新建了person表,里面有个字段 int  number
INSERT INTO person(number) VALUES(i);
END ;
END WHILE;
    END \\
-- ---先结束循环内容,再结束循环,再结束储存过程	结束需要.请注意 这个\\ 是我们先前在开头定义的

实践开始

环境:
win10 山寨版
mysql-5.7.27-winx64
navicat 不知道什么版本

创建表

--创建表

CREATE TABLE `per` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `number` bigint(20) NOT NULL COMMENT '编号',
  `name` varchar(32) NOT NULL COMMENT '姓名',
  `email` varchar(64) NOT NULL COMMENT '邮箱',
  `message` text COMMENT '个人信息',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `number` (`number`),
  KEY `index_name` (`name`) COMMENT '索引name'
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='索引测试表';

构建生成随机字符串函数 rand_string(n int)
待会需要在存储过程中用到

– —注意如果你的mysql版本比较高,是 8.0以及以上需要设置一下.5.7的不需要.

SET GLOBAL log_bin_trust_function_creators = 1;
-- ------------构建需要使用的方法 在存储过程中调用
-- ----------生成随机字符串
DELIMITER \\ -- 修改MySQL delimiter:'//'
DROP FUNCTION IF EXISTS `rand_string` //

CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255) CHARSET 'utf8'
BEGIN 
    DECLARE char_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(char_str, FLOOR(1 + RAND()*62), 1));
        SET i = i+1;
    END WHILE;
    RETURN return_str;
END \\
DELIMITER ;
-- ----------生成随机字符串
-- --- 存储过程中直接调用例如 rand_string(10); 获取字符串长度为10的随机字符串

构建存储过程

-- ------------如果已经存在则删除 存储过程 
DROP TABLE IF EXISTS insert_data_procedure_per; 
-- ------------ #### 使用存储过程在表中插入一百条数据
DELIMITER \\
DROP PROCEDURE IF EXISTS insert_data_procedure_per; 
CREATE
    PROCEDURE insert_data_procedure_per()
    BEGIN
DECLARE i INT DEFAULT 0;
DECLARE m INT DEFAULT 0;
DECLARE mstr varchar(16);
DECLARE n varchar(8);
DECLARE mes varchar(128);
WHILE(i<=100000) DO
BEGIN
SELECT i;
SET i=i+1;

/** 获取10000000 以内随机数 **/
select RAND()*1000000 into m; 
 /**调用 方法获取 随机字符串 **/
set n =rand_string(8); 
set mes =rand_string(128);
/**  m随机数加上800000 然后转化为12个字符的字符串 ***/
SET mstr=CAST(m+800000 AS CHAR(12)); 
INSERT INTO per(number,name,email,message,create_time,update_time) 
VALUES(i+80000,CONCAT(n,"name"),CONCAT(mstr,"@qq.com"),mes,NOW(),NOW());
END ;
END WHILE;
    END\\

执行存储过程

-- --调用(执行存储过程)
		call insert_data_procedure_per();

-- ---- 花絮:我的电脑性能不太好,执行了2580S才完,你们试试看.花了多少秒.
		-- ----- 查看效果
		SELECT * FROM per ;

技术细节

-- ---- 技术细节

DECLARE i INT DEFAULT 0;
DECLARE m varchar(20);
-- -- 构建循环
WHILE(i<=10000) DO
BEGIN
-- --循环内容需要开始和结束
-- -- 循环本身也需要开始和结束
END;
END WHILE;

-- --数字运算
SELECT i;
SET i=i+1;
-- -- 数据类型 转换
把 int i 和"" 拼接成 char类型," 这个空字符串凭借在后面,同理可以拼接其他的字符串.
SET m=concat(i,'');
-- -- 类型转换
SELECT CAST(100 AS CHAR); 
================语法为:Cast(字段名 as 转换的类型 )
CHAR[(N)] 字符型 
DATE  日期型
DATETIME  日期和时间型
DECIMAL  float型
SIGNED  int
TIME  时间型
-- --------===============
SELECT * FROM per;
	
DELETE FROM per;
-- ---------------
show INDEX FROM per;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值