使用触发器可以定制用户对表进行 [增, 删, 改] 操作时前后的行为, 注意: 没有查询
一, 创建触发器
- # 插入前
- 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 AFTER 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
- View Code
例子: 用户和日志表. 每次创建一个用户之后, 就在日志布表中生成这条记录
准备表:
- # 创建用户表
- 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 http://www.yiibai.com/mysql/insert-statement.html 定义的触发器中, 可以仅使用 NEW 关键字. 不能使用 OLD 关键字. 但是, 在为 DELETE 定义的触发器中, 没有新行, 因此您只能使用 OLD 关键字. 在 UPDATE http://www.yiibai.com/mysql/update-data.html 触发器中, OLD 是指更新前的行, 而 NEW 是更新后的行
二 使用触发器
触发器无法由用户直接调用, 而知由于对表的 [增 / 删 / 改] 操作被动引发的.
三 删除触发器
drop trigger trigger_userLog;
来源: http://www.bubuko.com/infodetail-2644511.html