MySQL-觸發器和自定義函數


一、自定義函數

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

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

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

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

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

  RETURN 類型

  函數體

范例:創建一個自定義函數,它返回EMP表中的工資總數作為結果

DELIMITER $$

CREATE FUNCTION aa()

         RETURNS INT

         BEGIN

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 自定義函數名;

 

二、觸發器

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM