参考博客
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;