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

    一、触发器的概念

    ​ 触发器是当某个表发生更改(delete、insert、update)时自动执行的一条MySQL语句(或位于begin和end语句之间的一组语句)。

    二、创建触发器

    ​ 在创建触发器时,需要给出4条信息:

    • 唯一的触发器名;
    • 触发器关联的表;
    • 触发器应该响应的活动(delete、insert或update);
    • 触发器何时执行(处理之前before或之后after)。

    举例:

    create trigger newproduct after insert on products
    for each row select 'Product added';
    /*
    	使用create trigger语句来创建名为newproduct的触发器,当对products表的任意一行成功执行插入操作之后,	 将在控制台显示Product added信息。
    */
    

    before或after?

    通常,将before用于数据验证和净化,目的是保证插入表中的数据确实是需要的数据。

    三、删除触发器

    drop trigger newproduct;

    四、使用触发器

    1. insert触发器

    ​ 在insert触发器代码内,你可以访问一个名为new的虚拟表,表中的内容为插入的行。

    举例:

    create trigger neworder after insert on orders
    for each row select new.order_num;
    -- 在每插入一行到orders表中时,将从虚拟表new中返回该行的order_num值显示在控制台上。
    

    2. delete触发器

    ​ 在delete触发器代码内,你可以访问一个名为old的虚拟表,表中的内容为删除的行。但注意old表中的内容全部都是只读的,不能更新。

    举例:

    create trigger deleteorder 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;
    /*
    	利用old表来把将要被删除行中的数据保存到一个名为archive_orders的存档表中。当然前提是你需要先创建		archive_orders表。
    */
    

    【注】使用before delete触发器的优点(相对于after触发器来说):

    ​ 如果由于某种原因,订单不能存档,即before触发器失败,那么delete删除行的操作也将不会被执行。

    多语句触发器:正如所见,触发器deleteorder使用begin和end语句标记触发器体。这在本例中其实不是必需的,不过也没有害处。使用begin end块的好处是触发器能容纳多条SQL语句(在begin end块中一条挨着一条)。

    3. update触发器

    ​ 在update触发器代码中,你既可以访问old虚拟表中更新之前行中的数据,也可以访问new虚拟表中更新之后行中的数据。

    举例:

    create trigger updatevendor before update on vendors
    for each row set new.vend_state = upper(new.vend_state);
    -- 用来保证vend_state总是大写,不管update语句中给出的是大写还是小写
    
  • 相关阅读:
    开发中常用的JS知识点集锦
    浏览器音频兼容和ffmpeg的音频转码使用
    web页面和小程序页面实现瀑布流效果
    微信小程序之支付密码输入demo
    Mac安装nginx配置过程
    前端工具mock的使用
    汇编语言学习
    Swift学习笔记
    如何快速融入团队并成为团队核心(四)
    如何快速融入团队并成为团队核心(三)
  • 原文地址:https://www.cnblogs.com/jiajun107/p/12893365.html
Copyright © 2011-2022 走看看