zoukankan      html  css  js  c++  java
  • 触发器

    一、简介  

    1、触发器是MySQL响应DELETE、INSERT、UPDATE语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句),其他MySQL语句不支持触发器。

    2、创建触发器时,需要给出4条信息:唯一的触发器名;触发器关联的表;触发器应该响应的活动(DELETE、INSERT、UPDATE);触发器何时执行(处理之前或之后)。

    3、只有表才支持触发器

    3、触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条DELETE、INSERT、UPDATE的之前和之后)。单一触发器不能与多个表关联,所以,如果需要一个对INSERT和UPDATE操作执行的触发器,则应该定义2个触发器。

    4、触发器失败:如果BEFORE触发器失败,则MySQL将不执行请求的操作。此外,如果BEFORE触发器或语句本身失败,则MySQL将不执行AFTER触发器(如果有的话)。

    5、触发器用CREATE TRIGGER语句创建。一个简单的例子:

    1 CREATE TRIGGER insert_product_after AFTER INSERT ON products
    2 FOR EACH ROW SELECT 'product added' INTO @var;

      如果直接SELECT,不把结果放在一个变量中的话,会报错"Not allowed to return a result set from a trigger"。在MySQL的trigger和function中不能出现select * from table形式的查询,因为其会返回一个结果集;结果集在MySQL的trigger和function中是不可接受的。

      CREATE TRIGGER创建了一个名为insert_product_after的触发器,这个触发器在INSERT语句成功执行后执行。这个触发器指定了FOR EACH ROW,因此代码对每个插入行执行。

    6、触发器删除使用DROP TRIGGER语句,如下所示:

    1 DROP TRIGGER insert_product_after;

      触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。

    二、INSERT触发器

    1、在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行。

    2、在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值)。

    3、对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。

    1 CREATE TRIGGER neworder AFTER INSERT ON orders
    2 FOR EACH ROW SELECT NEW.order_num INTO @var;

      测试上述触发器的例子:

    三、DELETE触发器

     1、在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,访问被删除的行。

    2、OLD中的值全部都是只读的,不能更新。

    3、一个演示使用OLD保存将要被删除的行到一个存档表中。

    1 DELIMITER //
    2 CREATE TRIGGER deleteorder BEFORE DELETE ON orders
    3 FOR EACH ROW
    4 BEGIN
    5     INSERT INTO record_orders(order_num, order_date, cust_id)
    6     VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
    7 END//

    四、UPDATE触发器

    1、在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值。

    2、在BEFORE UPDATE触发器中,NEW中的值也可能被更新(允许更改将要用于UPDATE语句中的值)

    3、OLD中的值全都是只读的,不能更新。

    4、一个例子将名字缩写改为大写

    1 CREATE TRIGGER update_vendor BEFORE UPDATE ON vendors
    2 FOR EACH ROW SET NEW.vend_state = UPPER(NEW.vend_state);
  • 相关阅读:
    java经典算法四十题
    使用windows Builder的一个中文乱码问题解决
    java经典算法四十题
    java经典算法四十题
    java经典算法四十题
    java经典算法四十题
    java经典算法四十题
    Redhat5下安装Oracle10g
    如何在DB2命令窗口执行sql脚本
    创建DB2跨库视图步骤
  • 原文地址:https://www.cnblogs.com/ACGame/p/10126858.html
Copyright © 2011-2022 走看看