数据库触发器知识总结

语法:

        CREATE TRIGGER trigger_name
	trigger_time
	trigger_event ON tbl_name
	FOR EACH ROW
	trigger_stmt

解释:

    TRIGGER:触发器关键字
    trigger_name:触发器名称
    trigger_time:触发时机(BEFORE或AFTER)
    trigger_event:触发事件(INSERT、UPDATE 或 DELETE)
    tbl_name:建立触发器的表名
    FOR EACH ROW:        每行受影响,触发器都执行,叫行级触发器。        Oracle触发器中,分行级触发器和语句触发器,可不写FOR EACH ROW,即无论影响多少行都只执行一次。        mysql不支持语句触发器,所以必须写FOR EACH ROW
    trigger_stmt:触发器程序体,可以是一句SQL语句或者用BEGIN和END包含的多条语句。

注:
    不能在一个表上建立两个相同类型的触发器。触发器类型有:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。

trigger_event详解

在MySQL中,还定义了LOAD DATA 和 REPLACE 语句。
    LOAD DATA 语句将一个文件装入到一个数据表中,相当于一系列的INSERT操作。
    REPLACE 语句当数据发生替代,即当插入的数据和原来的数据的主键或唯一索引相同时,会先把原先的数据删除,再插入一条新的数据。
    
    INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
    UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
    DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。

BEGIN...END详解

BEGIN
    [statement_list]
END
解释:
    statement_list代表一个或多个语句,以分号(;)结尾,这个与MySQL中分号是语句结束符相冲突,所以需要用DELIMITER命令修改分隔符。语法如下:
    DELIMITER new_delemiter
    new_delemiter 可以设为一个或多个长度的符号,默认的是分号(;)

实例:

假设系统中有两个表:
    班级表 class(班级号 classID, 班内学生数 stuCount)
    学生表 student(学号 stuID, 所属班级号 classID)

    要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:

    DELIMITER $
    create trigger tri_stuInsert after insert
    on student for each row
    begin
    declare c int;
    set c = (select stuCount from class where classID=new.classID);
    update class set stuCount = c + 1 where classID = new.classID;
    end$
    DELIMITER ;

实例详解:


    declare 定义局部变量,该变量只能在BEGIN...END符合语句中使用,并且定义在开头。语法如下:

    DECLARE var_name[,...] type [DEFAULT value]
    其中:
        var_name 为变量名称
        DEFAULT value 默认值为NULL


NEW与OLD详解:


    在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
    在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
    在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;

    注:
        OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。

查看触发器:


    SHOW TRIGGERS [FROM schema_name];

    其中,schema_name 即 Schema 的名称,在 MySQL 中 Schema 和 Database 是一样的,也就是说,可以指定数据库名,这样就不必先“USE database_name;”了。

删除触发器


    DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

触发器的执行顺序


    我们建立的数据库一般都是 InnoDB 数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:

    ①如果 BEFORE 触发器执行失败,SQL 无法正确执行。
    ②SQL 执行失败时,AFTER 型触发器不会触发。
    ③AFTER 类型的触发器执行失败,SQL 会回滚

附参考原文:

https://www.cnblogs.com/duodushu/p/5446384.html

你可能感兴趣的:(数据库,触发器)