自定義函數也是過程式對象之一,與存儲過程很類似。它們都是由SQL和過程式語句組成的代碼片斷,而且能夠從應用程序和SQL中調用。也有一些區別:html
RETURN子句中包含select子句時,select語句的返回結果只能是一行且只能有一列值數據庫
CREATE FUNCTION 自定義函數名 ([參數[,..]])函數 RETURN 類型spa 函數體htm |
範例:建立一個自定義函數,它返回EMP表中的工資總數做爲結果對象
DELIMITER $$blog CREATE FUNCTION aa()事件 RETURNS INTci BEGINget RETURN (SELECT SUM(sal) FROM emp); END $$ DELIMITER ; |
SHOW FUNCTION STATUS; //查看數據庫中有哪些自定義函數 |
SELECT 自定義函數名([參數[,..]]); //調用自定義函數 |
SELECT aa(); //調用剛纔建立的自定義函數aa,()必需要寫 |
範例:建立一個自定義函數,給定員工號返回員工姓名
DELIMITER $$ CREATE FUNCTION bb(no INT(4)) RETURNS VARCHAR(10) BEGIN RETURN (SELECT ename FROM emp WHERE empno=no); END $$ DELIMITER ; //建立自定義函數 SELECT bb(7499); //輸入參數7499,返回ALLEN |
範例:建立一個自定義函數,刪除emp表中存在,但dept表中沒有的記錄
DELIMITER $$ CREATE FUNCTION cc(dno INT(2)) RETURNS VARCHAR(10) BEGIN DECLARE dn INT(2); SELECT deptno INTO dn FROM emp WHERE deptno=dno; IF dn IS NULL THEN DELETE FROM dept WHERE deptno=dno; RETURN '已刪除'; ELSE RETURN '均存在'; END IF; END $$ DELIMITER ; |
DROP FUNCTION 自定義函數名;
觸發器是一種與表操做有關的數據庫對象,當觸發器所在表上出現指定事件時,將調用該對象,即表的操做事件觸發表上的觸發器的執行。
語法格式:
CREATE TRIGGER 觸發器名 觸發時間 觸發事件 ON 表名 FOR EACH ROW 觸發器動做 |
觸發時間:觸發器觸發的時刻,有兩個選項after/before,表示觸發器是在激活它的語句以前或以後觸發。若是想要驗證新數據是否知足使用的限制,則使用before選項。 |
觸發事件:指明瞭激活觸發程序的語句的類型,能夠爲如下值之一: INSERT:將新行插入表時激活觸發器,例如經過insert、load data和replace語句; UPDATE:更改某一行時觸發激活器,例如經過UPDATE語句; DELETE:從表中刪除某一行時激活觸發器,例如經過DELETE和REPLACE語句; |
觸發器動做:包含觸發器激活時將要執行的語句,若是要執行多個語句,可以使用BEGIN…END複合語句結構,這樣,就能使用存儲過程當中容許的相同語句。 |
範例:建立一個表table1,其中只有一列a。在表上建立一個觸發器,每次插入操做時,將用戶變量str的值設爲「TRIGGER IS WORKING」。
CREATE TABLE table1(a INT); //建立表 |
CREATE TRIGGER aa AFTER INSERT ON table1 FOR EACH ROW SET @str = ‘TRIGGER IS WORKING’; //建立觸發器 |
INSERT INTO table1 VALUES(10); //向表中插入一行數據 |
SELECT @str; //查看str的值 |
在MySQL觸發器中的SQL語句能夠關聯表中的任意列。但不能直接使用列的名稱去標誌,由於激活觸發器的語句可能已經修改、刪除或添加了新的列名,而列的舊名同時存在。所以必須用這樣的語法來標誌:「NEW.列名」或「OLD.列名」。「NEW.列名」用來引用新行的一列,「OLD.列名」用來引用更新或刪除它以前的已有行的一列。
對於INSERT語句,只有NEW是合法的;對於DELETE語句,只有OLD才合法;而UPDATE語句,能夠OLD和NEW同時使用。
範例:建立一個觸發器,當刪除dept表中某部門的信息時,同時將emp表中與該部門相關的數據同步刪除。
DELIMITER $$ CREATE TRIGGER bb AFTER DELETE ON emp FOR EACH ROW BEGIN DELETE FROM dept WHERE deptno=OLD.deptno; END $$ DELIMITER ; |
DELETE FROM emp WHERE deptno = 40; //刪除dept表上的20號部門,觸發事件 |
SELECT * FROM dept WHERE deptno = 40; //查詢,驗證功能實現 |
觸發器中調用存儲過程
範例:假設數據庫彙總有一個與emp表結構徹底同樣的表emp_copy,建立一個觸發器,在emp表中添加數據的時候,調用存儲過程,將emp_copy表中的數據與emp表同步。
DELIMITER $$ CREATE PROCEDURE data_copy() BEGIN REPLACE emp_cope SELECT * FROM emp; END $$ //定義存儲過程,建立一個與emp表結構徹底同樣的表emp_copy |
DELIMITER $$ CREATE TRIGGER abc AFTER INSERT ON emp FOR EACH ROW CALL data_copy(); END $$ DELIMITER ; //建立觸發器,調用存儲過程data_copy() |
SHOW TRIGGER; //查看數據庫中有哪些觸發器 |
DROP TRIGGER 觸發器名; |
做者:kerwin-chyl
文章連接:https:////www.cnblogs.com/kerwin-chyl
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利