MySQL之触发器
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询。
一、创建触发器
# 插入前
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
例子:用户和日志表。每次创建一个用户之后,就在日志布表中生成这条记录
准备表:
# 创建用户表
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-15 16:34:53 |
| 2 | 李四 | 2018-06-15 16:34:53 |
+----+--------+---------------------+
2 rows in set (0.00 sec)
注意:请注意,在为insert定义的触发器中,可以仅使用new关键字。不能使用old关键字。但是,在为delete定义的触发器中,没有新行,因此您只能使用old关键字。在update触发器中,old是指更新前的行,而new是更新后的行。
二、使用触发器
触发器无法由用户直接调用,而只能由于对表的【增/删/改】操作被动引发的。
三、删除触发器
drop trigger after_user_insert;

浙公网安备 33010602011771号