美文网首页
存储过程--触发器和事件

存储过程--触发器和事件

作者: wpf_register | 来源:发表于2019-09-29 09:38 被阅读0次

    原文链接-定义变量
    原文链接-存储函数
    原文链接-存储过程
    原文链接-游标简介
    原文链接-触发器和事件简介

    触发器

    存储函数与存储过程都是需要我们手动调用的。
    如果想在执行某条语句之前或者之后自动去调用另外一些语句,就需要考虑一下触发器。

    触发器的定义

    CREATE TRIGGER 触发器名
    {BEFORE|AFTER}          
    {INSERT|DELETE|UPDATE}
    ON 表名
    FOR EACH ROW 
    BEGIN
        触发器内容
    END
    
    
    大括号{}包裹并且内部用竖线|分隔的语句表示必须在给定的选项中选取一个值,
    比如{BEFORE|AFTER}表示必须在BEFORE、AFTER这两个之间选取一个。
    

    {BEFORE|AFTER} :表示触发器内容执行的时机
    Before:表示在具体的语句执行之前就开始执行触发器的内容
    After:表示在具体的语句执行之后才开始执行触发器的内容

    {INSERT|DELETE|UPDATE}:表示具体的操作MySQL只支持这三种

    FOR EACH ROW BEGIN ... END:表示对该语句影响的每一行记录都执行我们自定义的触发器内容。

    • 对于Insert,FOR EACH ROW影响的记录就是我们准备插入的那些新记录。
    • 对于Delete/Update,FOR EACH ROW影响的记录就是符合WHERE条件的那些记录。

    因为触发器会对某个语句影响的所有记录依次调用我们自定义的触发器内容,所以我们需要一种访问该记录中的内容的方式,MySQL提供了NEW和OLD两个单词来分别代表新记录和旧记录,它们在不同操作中的含义不同:

    • INSERT: NEW 代表准备插入的记录,不能使用OLD。
    • DELETE:OLD 代表删除前的记录,不能使用NEW。
    • UPDATE:NEW 代表修改后的记录,OLD代表修改前的记录。

    触发器定义

     delimiter $
     CREATE TRIGGER bi_t1
     BEFORE INSERT ON t1
     FOR EACH ROW
     BEGIN
         IF NEW.m1 < 1 THEN
             SET NEW.m1 = 1;
         ELSEIF NEW.m1 > 10 THEN
             SET NEW.m1 = 10;
         END IF;
    END $
    
    delimiter ;
    

    对表t1 定义了一个名叫bi_t1 的触发器,在对表t1进行插入之前,对准备插入的每一条记录都会执行BEGIN ... END之间的语句。
    NEW.列名:表示当前正在执行触发器内容的记录指定列的值。

    执行插入语句

    INSERT INTO t1(m1, n1) VALUES(5, 'e'), (100, 'z');
    最终结果:
    (5, ‘e’)
     (10,‘z’)
    
    触发器名称建议 解释
    bi_表名 Before Insert
    bd_表名 Before Delete
    bu_表名 Before Update
    Ai_表名 After Insert
    Ad_表名 After Delete
    Au_表名 After Update

    查看和删除

    查看所有触发器
    SHOW TRIGGERS;
    查看某个触发器
    SHOW CREATE TRIGGER 触发器名;
    删除触发器
    DROP TRIGGER 触发器名;
    

    注意事项

    • 触发器内容中不能有输出结果集的语句
    • 一个表最多只能定义6个触发器。
      BEFORE INSERT触发器
      BEFORE DELETE触发器
      BEFORE UPDATE触发器
      AFTER INSERT触发器
      AFTER DELETE触发器
      AFTER UPDATE触发器
    • NEW中的值可以被更改,OLD中的值无法更改

    事件

    事件创建

    如果我们想指定某些语句在某个时间点或者每隔一个时间段执行一次的话,可以选择创建一个事件。

    CREATE EVENT 事件名
    ON SCHEDULE
    {AT 某个确定的时间点 | EVERY 期望的时间间隔 [STARTS datetime][END datetime]}
    DO
    BEGIN
        具体的语句
    END
    

    事件支持两种类型的定时执行:

    1. 在某个确定的时间点执行。
    CREATE EVENT insert_t1
    ON SCHEDULE
    AT '2018-03-10 15:48:54'
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END
    

    执行时间可以是常量,也可以是表达式。
    DATE_ADD(NOW(), INTERVAL 2 DAY)表示该事件将在当前时间的两天后执行。

    CREATE EVENT insert_t1
    ON SCHEDULE
    AT DATE_ADD(NOW(), INTERVAL 2 DAY)
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END
    
    1. 每隔一段时间执行一次
      下例中EVERY 1 HOUR表示该事件将每隔1个小时执行一次
    CREATE EVENT insert_t1
    ON SCHEDULE
    EVERY 1 HOUR 
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END
    

    默认情况下,采用这种每隔一段时间执行一次的方式将从创建事件的事件开始,无限制的执行下去。我们也可以指定该事件开始执行时间和截止时间:

    CREATE EVENT insert_t1
    ON SCHEDULE
    EVERY 1 HOUR 
    STARTS '2018-03-10 15:48:54' 
    ENDS '2018-03-12 15:48:54'
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END
    

    创建好事件之后我们就不用管了,到了指定时间,MySQL服务器会帮我们自动执行的。

    查看/删除

    查看当前数据库中所有语句
    SHOW EVENTS;
    
    查看某个具体的事件的定义
    SHOW CREATE EVENT 事件名;
    
    删除事件
    DROP EVENT 事件名;
    

    注意事项

    默认情况下,MySQL服务器并不会帮助我们执行事件,除非我们在启动服务器的时候就指定了下边这个选项:

    event_scheduler = ON
    

    如果在服务器已经启动的情况下,我们可以通过设置event_scheduler的系统变量来让MySQL服务器帮助我们执行事件。

    SET GLOBAL event_scheduler = ON;
    

    相关文章

      网友评论

          本文标题:存储过程--触发器和事件

          本文链接:https://www.haomeiwen.com/subject/zaiiuctx.html