mysql触发器
mysql触发器创建和使用
触发器
触发器是一种特殊的存储过程,和存储过程不同的是不需要主动调用,而是会监听表的动作(插入、删除、更新等)而触发执行。
mysql触发器
触发器只有两种触发时机和三种触发事件,分别是:
触发时机(TIMING): before 表中数据发生改变前; after 表中数据发声改变后。
触发事件(EVENT): insert、delete和update
组合起来就是六种情况,在一张表上每一种情况只支持一个定义。
mysql触发器使用
创建触发器:1
2
3
4
5
6
7
8delimiter ## --定义##为语句结束符,这样可以更自由地写sql语句
create trigger TRIGGER_NAME TIMING EVENT on TABLE_NAME
for each row -- 固定写法,针对每个行数据都执行如下sql语句
begin
sql语句;
end
##
delimiter ; --恢复分号为语句结束符
删除触发器:1
drop trigger if exists TRIGGER_NAME
变量:1
2new: 新增的记录 insert和update两个事件有该值
old: 之前的记录 delete和update两个事件有该值
基本使用
两张表:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18mysql> desc user;
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| user_type | int(11) unsigned | NO | | 0 | |
| company | varchar(100) | NO | | | |
| name | varchar(20) | NO | | NULL | |
| age | int(11) unsigned | NO | | 0 | |
| salary | int(11) unsigned | NO | | 0 | |
+-----------+------------------+------+-----+---------+----------------+
mysql> desc user_count;
+--------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+-------+
| counts | int(11) unsigned | NO | | NULL | |
+--------+------------------+------+-----+---------+-------+
添加两个触发器:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19-- 插入触发器
delimiter ##
create trigger user_tri_insert after insert on user
for each row
begin
update user_count set counts = counts + 1;
end
##
delimiter ;
-- 删除触发器
delimiter ##
create trigger user_tri_delete after delete on user
for each row
begin
update user_count set counts = counts - 1;
end
##
delimiter ;
执行表插入和删除的sql:1
2
3
4
5
6
7insert into user(user_type, company, name, age, salary) values(1, "x", "f", 60, 6000);
---会发现user_count中的值增加了1
delete from user where name = 'f';
---会发现user_count中的值减少了1
注意事项
- mysql触发器中的sql语句不能对绑定的表操作,即 绑定到了user表,则触发器中不能对user进行update、insert、delete等操作;
- 使用过多会导致维护和排查问题变得困难。