触发器
使用触发器可以定制用户对表进行的【增,删,改】操作时前后的行为。注意:没有查询。
创建触发器:
插入前:
create trigger tri_before_insert_tb1 before insert on tb1 for each row
begin
...
end
插入后:
create trigger tri_after_insert_tb1 after insert on tb1 for each row
begin
...
end
删除前:
create trigger tri_before_delete_tb1 before delete on tb1 for each row
begin
...
end
删除后:
create trigger tri_after_delete_tb1 before delete on tb1 for each row
begin
...
end
更新前:
create trigger tri_before_update_tb1 before update on tb1 for each row
begin
...
end
更新后:
create trigger tri_after_update_tb1 after update on tb1 for each row
begin
...
end
例子:用户和日志表,每次创建一个用户后,就在日志表中生成这条记录。
# 创建用户表 create table user( id int primary key auto_increment, name varchar(20) not null, reg_time datetime, # 注册用户的时间 affirm enum('yes','no') # no表示该用户执行失败 ); #创建日志表 create table userLog( id int primary key auto_increment, u_name varchar(20) not null, u_reg_time datetime # 注册用户的时间 ); # 创建触发器 delimiter 默认情况下,delimiter是分号 触发器名称应遵循命名约定[trigger time]_[table name]_[trigger event] delimiter // create trigger after_user_insert after insert on user for each row begin if new.affirm = 'yes' then insert into userLog(u_name,u_reg_time) values(new.name,new.reg_time); end if; end // delimiter ; #往用户表中插入记录,触发触发器,根据if的条件决定是否插入数据 insert into user(name,reg_time,affirm) values ('张三',now(),'yes'),('李四',now(),'yes'),('王五',now(),'no'); # 查看日志表,发现多了两条记录 ,大家应该看到for each row就明白了 mysql> select * from userlog; +----+--------+---------------------+ | id | u_name | u_reg_time | +----+--------+---------------------+ | 1 | 张三 | 2018-06-14 17:52:49 | | 2 | 李四 | 2018-06-14 17:52:49 | +----+--------+---------------------+ 2 rows in set (0.00 sec)
注意:在为insert定义的触发器中,仅可以使用new关键字,不能使用old关键字,但是在为delete定义的触发器中,没有新行,因此只能使用old关键字,在update触发器总,old是指更新前的行,new是指更新后的行。
触发器无法由用户直接调用,是由于对表的【增,删,改】操作被动引发的。
删除触发器:
drop trigger 触发器名