MySQ储存过程的血泪史

MySQ储存过程的血泪史

1.为什么有储存过程

为了简单方便的进行sql执行

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='表名';

 

posted @ 2020-08-20 18:42  数据阮小白  阅读(110)  评论(0编辑  收藏  举报