MySQL-觸發器和自定義函數

1、自定義函數

自定義函數也是過程式對象之一,與存儲過程很類似。它們都是由SQL和過程式語句組成的代碼片斷,而且能夠從應用程序和SQL中調用。也有一些區別:html

  1. 自定義函數不能擁有輸出參數,由於自定義函數自己就是輸出參數;
  2. 不能用call語句來調用自定義函數;
  3. 自定義函數必須包含一條return語句,而此特殊語句不容許包含在存儲過程當中;

RETURN子句中包含select子句時,select語句的返回結果只能是一行且只能有一列值數據庫

1、建立自定義函數的語法格式

CREATE FUNCTION 自定義函數名 ([參數[,..]])函數

  RETURN 類型spa

  函數體htm

範例:建立一個自定義函數,它返回EMP表中的工資總數做爲結果對象

DELIMITER $$blog

CREATE FUNCTION aa()事件

         RETURNS INTci

         BEGINget

RETURN (SELECT SUM(sal) FROM emp);

         END $$

DELIMITER ;

2、查看和調用自定義函數

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 ;

3、刪除自定義函數

DROP FUNCTION 自定義函數名;

 

2、觸發器

觸發器是一種與表操做有關的數據庫對象,當觸發器所在表上出現指定事件時,將調用該對象,即表的操做事件觸發表上的觸發器的執行。

1、建立觸發器

語法格式:

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()

2、查看觸發器

SHOW TRIGGER;    //查看數據庫中有哪些觸發器

3、刪除觸發器

DROP TRIGGER 觸發器名;

 

做者:kerwin-chyl

文章連接:https:////www.cnblogs.com/kerwin-chyl

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利

相關文章
相關標籤/搜索