MySQL 触发器

Ewan又来学习啦,mysql触发器个人学习感悟奉上。

  • 1.触发器定义

    sql server里面对某个表的一定的操作,触发某种条件而执行的一段程序。它是一个特殊的存储过程。

  • 2.为什么使用触发器

    1)强制业务规则
    2)审计跟踪 –用于跟踪网站区域流量
    3)验证
    4)完整性约束引用 –表的关系在项目整个生命周期中的稳定

  • 3.触发器基本语法
    create trigger triggre_name trigger_time trigger_event on table_name for each row trigger_stmt;

    trigger_name:触发器名称;
    trigger_time:触发时机,取值为before 或after;
    trigger_event:触发事件,取值为 insert、update或 delete;
    table_name:建立触发器的表名;
    trigger_stmt:触发器程序体,可以是一句sql语句,或者用 begin 和 end 包含的多条sql语句。

  • 4.before与after详解

    before:(insert、update)可以对new进行修改,after不能对new进行修改。两者都不能修改old数据。
    表插入字段值需要用new计算,只能用before,在别的表中记录插入成功记录或统计插入的条数用after。
    after update 也就是执行完你的更新之后.再执行这个触发器的语句..
    before update 就是执行完这个触发器的语句,再执行你的更新.
    可以建立6种触发器,即:before insert、before update、before delete、after insert、after update、after delete
    **有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器

  • 5,trigger_event详解

    msql除了对insert,update,delete 基本操作进行定义外,还定义了load data和replace语句,这两种语句也能引起
    上述6中类型的触发器的触发。
    load data 语句用于将一个文件装入到一个数据表中,相当与一系列的 insert 操作。
    replace语句一般来说和insert语句很像,只是在表中有primary key或unique 索引时,如果插入的数据和原来 primary
    key或unique索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条 replace 语句有时候等价于一条 update。
    insert 型触发器:插入某一行时激活触发器,可能通过 insert、load data、replace 语句触发;
    update 型触发器:更改某一行时激活触发器,可能通过 update 语句触发;
    delete 型触发器:删除某一行时激活触发器,可能通过 delete、replace 语句触发。

  • 6.begin … end详解

    在mysql中,begin … end 语句的语法为:
    begin [statement_list] end
    statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾。
    解释器遇到 statement_list 中的分号后就开始执行,然后会报出错误,因为没有找到和 begin匹配的end
    delimiter命令,它是一条命令,不需要语句结束标识,语法为:
    delimiter new_delemiter
    new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;),我们可以把它修改为其他符号,如管道符:delimiter |
    在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了管道符,才认为是语句结束。注意,使用完之后,我们还
    应该记得把它给修改回来。

  • 7.new与old详解

    new关键字,和mysql中的 inserted和deleted类似,mysql中定义了new和old,用来表示
    触发器的所在表中,触发了触发器的那一行数据。
    具体地:
    在insert型触发器中,new 用来表示将要(before)或已经(after)插入的新数据;
    在 update型触发器中,old用来表示将要或已经被修改的原数据,new用来表示将要或已经修改为的新数据;
    在 delete 型触发器中,old用来表示将要或已经被删除的原数据;
    使用方法: new.columnName (columnName 为相应数据表某一列名);
    另外,old 是只读的,而 new 则可以在触发器中使用 set 赋值,这样不会再次触发触发器,造成循环调用。

  • 8.删除触发器

    和删除数据库、删除表格一样,删除触发器的语法如下:
    drop trigger trigger_name;
    查看现有的触发器:
    show triggers\G;

  • 9.触发器的执行顺序

    我们建立的数据库一般都是 InnoDB 数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,mysql会回滚事务,如下:
    1)如果before触发器执行失败,sql无法正确执行。
    2)sql执行失败时,after型触发器不会触发。
    3)after类型的触发器执行失败,sql会回滚。

触发器可以大大减少只为确保数据库引用完整性和业务规则而编写的代码量。

mysql视图学习至此告一段落,以上内容如有语法结构错误,请指出或给予相应的解决方案。

坚持原创技术分享,您的支持将鼓励我继续创作!