1.定义
顾名思义,触发就是满足一定条件下产生什么动作,完整的定义是触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
2.语法:
1 CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:触发器的名称
tirgger_time:触发时机,为BEFORE或者AFTER
trigger_event:触发事件,为INSERT、DELETE或者UPDATE
tb_name:表示建立触发器的表明,就是在哪张表上建立触发器
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
可以说MySQL创建以下六种触发器: BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE AFTER INSERT,AFTER DELETE,AFTER UPDATE
3.牛客笔试题
1 // 题目:构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。 2 3 CREATE TABLE employees_test( 4 ID INT PRIMARY KEY NOT NULL, 5 NAME TEXT NOT NULL, 6 AGE INT NOT NULL, 7 ADDRESS CHAR(50), 8 SALARY REAL 9 ); 10 11 CREATE TABLE audit( 12 EMP_no INT NOT NULL, 13 NAME TEXT NOT NULL 14 );
1 create trigger audit_log after insert on employees_test for each row begin 2 insert into audit values(new.id, new.name); 3 end
MySQL 中定义了 NEW 和 OLD,用来表示 触发器的所在表中,触发了触发器的那一行数据。
具体的例子如下:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
4.用法扩展
BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开
tips:一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突
为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||
当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;
1 DELIMITER || 2 create trigger audit_log after insert on employees_test for each row begin 3 insert into audit values(new.id, new.name); 4 // 其他语句 5 end 6 DELIMITER ;