玩转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<age<15 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);//语句的调用mysql

注意 存储函数有一条限制 不容许调用语句,对本函数正在读或写的数据表进行修改 换句话说 //select语句正在执行一个getName()的存储函数正在查询student表,而此时你不能在getName函数里面使用updateName存储函数 存储过程的参数 IN//调用者传入参数,函数内部处理,整个过程对调用者不可见, OUT//过程返回值给调用者,值对调用者可见, INOUT//运行调用者向过程传入一个值,再返回这个值web

例:// 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 ;sql

使用 call getStudentname(@NAME,@NAMES);//过程将把值放到参数中 查看:select 'male:',@NAME; 注意:对于存储函数 全部的参数都像IN参数;session

触发器: 与特定的表相关联,相应的语句触发以后将会执行 如(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:对日期数据表进行轮转等code

在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}get

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<current_timestamp -interval 1day 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;

  1. 开启事件

ALTER EVENT e_test ENABLE;

  1. 将天天清空test表改成5天清空一次:

ALTER EVENT e_test ON SCHEDULE EVERY 5 DAY;

4、删除事件(DROP EVENT) 语法很简单,以下所示:

DROP EVENT [IF EXISTS] event_name 。。。。。。。未完待续

相关文章
相关标签/搜索