首页 > 代码库 > 玩转mysql跟我一起装B,一起飞
玩转mysql跟我一起装B,一起飞
存储函数:想调用者返回一个结果,这个结果可以用在表达式里,像(hex(),cast(),cos()这样的函数)
存储过程,使用call()语句调用,是一个独立的过程,不能用在函数里
存储过程使用情况总结:
1:实现某种动作效果无需返回一个值
2:运算返回多个值,函数做不到这一点
例存储函数:
delimiter$$
create function f_a(ai_n int)
returns varchar(64)
begin
declare vs_res varchar(64);
declare vi_count int;
select max(n),count(1) into vs_res ,vi_count from d where i = ai_n;
if vs_res is null then
set vs_res = ‘‘;
end if;
return vs_res;
end$$
DELIMITER ;
//执行完毕后将返回运算的值
需要设置set global log_bin_trust_function_creators=TRUE。 //使用存储函数 select f_a(12); 我这里只是使用了select语句 但是存储函数 可以使用任何复杂的语句 insert ,delete语句等
存储过程
例:Delimiter #
create proceduree getstudentName(in age){//创建存储过程 参数说明(in age)//in代表 调用者向程序传入参数
begin//复合语句的开始
delecare getName varchar(10);//声明一个变量 getName;
if age<10
then set getName=“小学生”;
end if;
if 10 then set getName=“初中生”;
end if;
start transaction;//开起事物
while(age<100)
set age=age+1;
insert into student(id)values(age);
end while;
commit;//提交事务
end #;//复合语句的结束
delimiter ;
call getStudentName(5);//语句的调用
注意 存储函数有一条限制
不允许调用语句,对本函数正在读或写的数据表进行修改 换句话说 //select语句正在执行一个getName()的存储函数正在查询student表,而此时你不能在getName函数里面使用updateName存储函数
存储过程的参数 IN//调用者传入参数,函数内部处理,整个过程对调用者不可见, OUT//过程返回值给调用者,值对调用者可见, INOUT//运行调用者向过程传入一个值,再返回这个值
例://
delimeter $
create procedure getStuentname(OUT P-name,OUT pgirlname)
begin
select * from student where sex=‘男‘ into P-name;
select * from studnt where sex =‘女‘ into pgirlname;
end;
delimeter ;
使用 call getStudentname(@NAME ,@NAMES);//过程将把值放到参数中
查看:select ‘male:‘,@NAME ;
注意:对于存储函数 所有的参数都像IN参数;
触发器:
与特定的表相关联,相应的语句触发之后将会执行 如(insert,delete,update语句)
好处:1:触发器可以检查数据的更新和删除操作,换句话说 我们可以使用触发器检查数据的完整性,比如检查某个值是否落在0-100之间,触发器可以用来对输入数据进行必要的过滤
2:表达式结果赋给数据例作为默认值, 3:删除或修改之前检查其内容,例对现有数据行的修改记录到一个日志里 格式:create trigger trigger_name {before/after}//花括号代表可选 {insert /update/delete} on table_name//表名 for each row trigger_stmt// trigger_stmt代表将要执行的触发语句
//使用NEW.col_name来引用 使用insert和update插入或修改的新数据行里面的数据 使用OLD.col_name来引用update和delete语句修改的老数据行
例:若你想在新数据行被插入之前,改变他的某个数据列的值 可以使用只需要创建一个触发器 在before语句之前写 set new.Column=“xxxx”;即可
例:delimiter$
create trigger trigger_game before insert on student
for each row
set NEM.age=55;
end$
delimiter;
mysql中的事件
1:作用 定期清理垃圾数据
2:在特定的时间之类生成报表的数据
3:对日期数据表进行轮转等
在mysql中开启事件:
set global event_scheduler=OFF
set global event_scheduler=ON//开起
show variables like ‘event_scheduler‘;//查看事件schedule
语法
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT ‘comment‘] DO sql_statement;
schedule:
AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
INTERVAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
5天后开启每天定时清空test表,一个月后停止执行:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE test.aaa;
[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
每天定时清空test表(只执行一次,任务完成后就终止该事件):
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE
DO TRUNCATE TABLE test.aaa;
create event expire_web_sesison//函数每四小执行一次,就把操过一天的数据清除掉
on schedule every 4 hour
do
delete from web_session
where last_visit every n interval//用来给出时间定期执行的时间间隔
interval 函数类似于DATEADD()//函数 值可以是 day hour month
DATEADD() 函数在日期中添加或减去指定的时间间隔。
ALTER EVENT event_name
[ON SCHEDULE schedule] [RENAME TO new_event_name] [ON COMPLETION [NOT] PRESERVE] [COMMENT ‘comment‘] [ENABLE | DISABLE] [DO sql_statement]
1) 临时关闭事件
ALTER EVENT e_test DISABLE;
2) 开启事件
ALTER EVENT e_test ENABLE;
3) 将每天清空test表改为5天清空一次:
ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;
四、删除事件(DROP EVENT)
语法很简单,如下所示:
DROP EVENT [IF EXISTS] event_name
。。。。。。。未完待续
玩转mysql跟我一起装B,一起飞