触发器 trigger 需要定义(就是将需要执行的sql语句写好),触发器的执行是通过你定义的某一个事件来触发的
通常这些事件会触发触发器
- UPDATE
- INSERT
- DELETE
old和new关键字
使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。
在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。
OLD和NEW是对触发程序的MySQL扩展。
创建触发器
一个触发器可以有多条执行语句,也可以是单条执行语句
// 创建语法create trigger trigger_namebefore|after trigger_eventon table_name for each row trigger_stmt* before|after声明触发器执行的时间,在事件之前还是之后* event 声明触发的事件,上文三选一* table_name 是具体那一张表* stmt 表示触发器激活之后执行的语句
create trigger tri_diarytimebefore inserton t_dept for each rowinsert into t_diary values(null,'t_dept',now());
创建多条执行语句的触发器
与单条执行语句的触发器不同的是,多条语句的触发器在创建的时候多了两个关键字 begin 和 end ,需要将多条执行语句放在这两个关键字之间。
delimiter @ // 修改结束符create trigger trigger_nameafter inserton user for each rowbegininsert into user values(null,'hhh',now());insert into user values(null,'hhh',now());end@ // 整个语句结束delimiter ; // 将结束符改为默认
查看触发器
show triggers;
删除触发器
drop trigger trigger_name;
