存儲函數:想調用者返回一個結果,這個結果能夠用在表達式裏,像(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]
ALTER EVENT e_test DISABLE;
ALTER EVENT e_test ENABLE;
ALTER EVENT e_test ON SCHEDULE EVERY 5 DAY;
4、刪除事件(DROP EVENT) 語法很簡單,以下所示:
DROP EVENT [IF EXISTS] event_name 。。。。。。。未完待續