MySQ储存过程的血泪史
1.为什么有储存过程
2,第一个储存过程(生成一百万条数据)
1.创建一个简单student表,表字段有id name,sroce,age
2.创建一个函数随机生成name
点击数据库中的'函数'-->新建函数-->确定
BEGIN
declare str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSQUVWXYZ';
declare i int DEFAULT 0;
declare res_str VARCHAR(255) default '';
while i < n do
set res_str = concat(res_str,substr(str,FLOOR(rand()*52+1),1));
set i = i + 1;
end while;
return res_str;
end
3.创建一个函数随机生成sroce
建函数如步骤2
BEGIN
declare res_str VARCHAR(255) default '';
set res_str = concat(res_str,FLOOR((RAND()+10)*9 ));
return res_str;
end
4.创建存储过程
点击数据库中的'函数'-->新建过程-->确定
BEGIN
-- 声明一个变量记录当前是第几条
declare i int DEFAULT 0;
declare str VARCHAR(255) DEFAULT '';
-- 默认情况下是自动提交sql
set autocommit = 0; -- 禁止自动提交sql
-- 循环
START TRANSACTION; -- 开启事务
loopName:repeat
set i = i + 1;
-- 插入数据 id 增加, name 随机,年龄随机
insert into t_student values (startNum + i,rand_str(5),rand_fenshu(2),floor(10+rand()*30));
until i = max_num
end repeat ;
-- 判断数据是否插入成功
IF max_num = i
then
commit; -- 待循环完毕后再进行提交,即整体提交整体的 sql,这样可以提高效率,否则循环里会一次一次的去提交sql,数据多了会很慢。
SELECT concat(str,'成功插入',max_num,'条数据') as successfulily;
ELSE
ROLLBACK;
SELECT concat(str,'数据插入失败') as failed;
END IF;
end
5,注意踩过的坑
1.运行完储存过程一定要刷新才能看见的
2.一定要设置set autocommit = 0; -- 禁止自动提交sql
3.开启事务:START TRANSACTION;
4,判断条件--注意书写方式
IF max_num = i
then
commit; -- 待循环完毕后再进行提交,即整体提交整体的 sql,这样可以提高效率,否则循环里会一次一次的去提交sql,数据多了会很慢。
SELECT concat(str,'成功插入',max_num,'条数据') as successfulily;
ELSE
ROLLBACK;
SELECT concat(str,'数据插入失败') as failed;
END IF;
5.concat的用法是拼接字符串
6.查看分区表的分区
SELECT
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
FROM
INFORMATION_SCHEMA.partitions
WHERE
TABLE_SCHEMA = schema()
AND TABLE_NAME='表名';
障碍与失败,是通往成功最稳靠的踏脚石,肯研究、利用它们,便能从失败中培养出成功。