您好,登錄后才能下訂單哦!
今天小編給大家分享一下MySQL如何自定義函數(shù)及觸發(fā)器的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
自定義函數(shù)是一種對MySQL擴展的途徑,其用法與內(nèi)置的函數(shù)相同。
定義函數(shù)的兩個必要條件:參數(shù)、返回值。函數(shù)可以返回任意類型的值,同樣可以接收這些類型的參數(shù)。
關(guān)于函數(shù)體:
函數(shù)體是由合法的SQL語句構(gòu)成。
函數(shù)體可以是簡單的SELECT或INSERT語句。
函數(shù)體如果為符合結(jié)構(gòu)則使用BEGIN....AND語句包裹。
復(fù)合結(jié)構(gòu)可以包含聲明、循環(huán)、控制結(jié)構(gòu)等等。
重點:自定義的函數(shù)不能重名,類似于定義了一個全局變量,變量名不能一致。
語法格式:
create function 函數(shù)名(參數(shù)列表) returns type(返回值類型) begin --SQL語句 end;
需求:定義一個存儲過程的函數(shù),獲取滿足條件的總記錄條數(shù)
實現(xiàn):
delimiter $ create function fun(countryId int) returns int begin # 定義一個存儲總數(shù)據(jù)條數(shù)的變量 declare cum int default 0; # 查詢等于傳遞參數(shù)的全部的數(shù)據(jù)數(shù),然后將其賦值給定義的變量 select count(*) into cum from city where country_id = countryId; # 返回結(jié)果值。存儲函數(shù)必須有返回值 return cum; end $ delimiter ;
語法格式:
select 函數(shù)名(參數(shù)列表);
注意:調(diào)用存儲過程的時候使用的是call關(guān)鍵字,但是在調(diào)用存儲函數(shù)的時候直接使用select即可,就和調(diào)用MySQL一個普通的聚合函數(shù)的方式一樣即可。
select fun(1); # 這里和存儲過程一樣,調(diào)用的時候需要加小括號和參數(shù),但是在刪除的時候指定函數(shù)名即可
語法格式
drop [if exists] function fun;
觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫對象,指在 insert/update/delete 之前或之后,觸發(fā)并執(zhí)行觸發(fā)器中定義的SQL集合。觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫端確保數(shù)據(jù)的完整性、日志記錄以及數(shù)據(jù)校驗等操作。
只有增加、刪除、修改的時候才可以使用觸發(fā)器,查詢的時候不可以使用觸發(fā)器。
使用別名OLD和NEW來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫是相似對的。MySQL觸發(fā)器還只支持行級觸發(fā),不支持語句級觸發(fā)。oracle支持行級和語句級觸發(fā)器都支持。
OLD、NEW這兩個變量又叫做行記錄變量。可以通過這個兩個變量來獲取即將要操作的數(shù)據(jù)表中的數(shù)據(jù)。
語法格式:
create trigger(觸發(fā)器) trigger_name(觸發(fā)器名稱) before/after insert/update/delete on tab_name(表名) [for each row](行級觸發(fā)器) begin trigger_stmt;(觸發(fā)器的邏輯) end;
需求:通過觸發(fā)器記錄 emp 表的數(shù)據(jù)變更日志 emp_logs ,其中包含增加、修改、刪除
實現(xiàn):
分析:一個觸發(fā)器只能操作一種數(shù)據(jù)的操作類型,不可以同時完成增加、修改、刪除的操作。所以此時需要定義多個觸發(fā)器來完成這個日志記錄的任務(wù)。
因為 MySQL中是行級操作的觸發(fā)器,所以 new 以及 old 中存儲的都是一整行數(shù)據(jù)。
創(chuàng)建執(zhí)行 insert 的觸發(fā)器:
使用 new 關(guān)鍵字可以獲取到操作的數(shù)據(jù),在insert模式下,new變量中存儲的就是即將插入的數(shù)據(jù)
使用的是 after ,在執(zhí)行完表 emp 的新增之后執(zhí)行這個觸發(fā)器記錄日志。
這個觸發(fā)器什么時候執(zhí)行與兩點有關(guān):
必須操作的是 emp 這個表,也就是on后面聲明的這個表。
必須執(zhí)行的 insert 操作。
創(chuàng)建執(zhí)行 update 的觸發(fā)器:
此時 old 變量中存儲的是被修改前的數(shù)據(jù),new 變量中存儲的是修改之后的數(shù)據(jù)
創(chuàng)建執(zhí)行 delete 的觸發(fā)器:
此時的 old 變量中存儲的即將刪除的數(shù)據(jù)
測試:測試都必須是操作的 emp 表,這樣才會觸發(fā)上邊定義的觸發(fā)器。
語法結(jié)構(gòu):
drop trigger [schema_name.](數(shù)據(jù)庫名)trigger_name(觸發(fā)器名);
如果沒有指定 schema_name(數(shù)據(jù)庫名),默認(rèn)為當(dāng)前數(shù)據(jù)庫。
可以通過執(zhí)行 show triggers 命令查看觸發(fā)器的狀態(tài)、語法等信息。
語法結(jié)構(gòu):
show triggers;
以上就是“MySQL如何自定義函數(shù)及觸發(fā)器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。