Mysql触发器

399 次查看

 MySQL5版本后支持触发器

    只有表支持触发器,视图不支持触发器

    MySQL语句在需要的时被执行,存储过程也是如此,但是如果你想要某条语句(或某些语句)在事件发生时自动执行,那该怎么办呢:例如:

        1 每增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,区的缩写是否为大写

        2 每当订购一个产品时,都从库存数量中减少订购的数量

        3 无论何时删除一行,都在某个存档中保留一个副本

    这写例子的共同之处是他们都需要在某个表发生更改时自动处理。这就是触发器。触发器是MySQL响应一下任意语句而自动执行的一条MySQL语句(或位于BEGINEND语句之间的一组语句)

    1 DELETE

    2 INSERT

    3 UPDATE

    其他的MySQL语句不支持触发器

    创建触发器

        创建触发器需要给出4条信息

        1 唯一的触发器名;  //保存每个数据库中的触发器名唯一

        2 触发器关联的表;

        3 触发器应该响应的活动(DELETEINSERTUPDATE

        4 触发器何时执行(处理前还是后,前是BEFORE 后是AFTER

        创建触发器用CREATE TRIGGER

        CREATE TRIGGER newproduct AFTER INSERT ON products

        FOR EACH ROW SELECT‘Product added’

       创建新触发器newproduct ,它将在INSERT语句成功执行后执行。这个触发器还镇定FOR EACH ROW,因此代码对每个插入的行执行。这个例子作用是文本对每个插入的行显示一次product added

        FOR EACH ROW 针对每个行都有作用,避免了INSERT一次插入多条语句

    触发器定义规则

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

    触发器失败  如果BEFORE(之前)触发器失败,则MySQL将不执行SQL语句的请求操作,此外,如果BEFORE触发器或语句本身失败,MySQL将不执行AFTER(之后)触发器

    删除触发器

        DROP TRIGGER newproduct

        触发器不能更新或覆盖,所以修改触发器只能先删除再创建

    使用触发器

        我们来看看每种触发器以及它们的差别

    INSERT 触发器

        INSERT触发器在INSERT语句执行之前或之后执行。需要知道以下几点:

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

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

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

        提示:通常BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)。本提示也适用于UPDATE触发器

    DELETE 触发器

        DELETE触发器在语句执行之前还是之后执行,需要知道以下几点:

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

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

        例子演示适用OLD保存将要除的行到一个存档表中

        CREATE TRIGGERdeleteorder BEFORE DELETE ON orders

        FOR EACH ROW

        BEGIN  

        INSERT INTO archive_orders(order_num , order_date , cust_id)

        VALUES(OLD.order_num , OLD.order_date , OLD.cust_id);

        END;

        //此处的BEGIN  END块是非必需的,可以没有

    在任何订单删除之前执行这个触发器,它适用一条INSERT语句将OLD中的值(将要删除的值)保存到一个名为archive_orders的存档表中

    BEFORE DELETE触发器的优点是(相对于AFTER DELETE触发器),如果由于某种原因,订单不能被存档,DELETE本身将被放弃执行。

    多语言触发器  正如上面所见,触发器deleteorder 使用了BEGINEND语句标记触发器体。这在此例中并不是必需的,不过也没有害处。使用BEGIN  END块的好处是触发器能容纳多条SQL语句。

    UPDATE触发器

        UPDATE触发器在语句执行之前还是之后执行,需要知道以下几点:

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

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

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

            例子:保证州名的缩写总是大写(不管UPDATE语句给出的是大写还是小写)

            CREATE TRIGGER updatevendor BEFORE UPDATE ON vendores FOR EACH ROW SETNEW.vend_state = Upper(NEW.vend_state)

    触发器的进一步介绍

    1 与其他DBMS相比,MySQL5中支持的触发器相当初级。以后可能会增强

    2 创建触发器可能需要特殊的安全访问权限,但是触发器的执行时自动的.如果INSERT UPDATE DELETE能执行,触发器就能执行

    3 应该用触发器来保证数据的一致性(大小写、格式等)。在触发器中执行这种类型的处理的优点是它总是进行这个处理,而且是透明地进行,与客户机应用无关

    4 触发器的一种非常有意义的使用创建审计跟踪。使用触发器把更改(如果需要,甚至还有之前和之后的状态)记录到另一表非常容易

    5 遗憾的是,MySQL触发器中不支持CALL语句,这表示不能从触发器中调用存储过程。所需要的存储过程代码需要复制到触发器内

赞赏


微信赞赏

支付宝赞赏

java架构师历程,欢迎扫描关注