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

本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利

相关文章
相关标签/搜索