触发器
触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL
也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。
作用
-
触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。
-
触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
-
触发器还可以强制执行业务规则
-
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
实际应用
尽管触发器有很多优点,但是在实际的项目开发中,特别是OOP思想的深入,触发器的弊端也逐渐突显,主要:
1、过多的触发器使得数据逻辑变得复杂
2、数据操作比较隐含,不易进行调整修改
3、触发器的功能逐渐在代码逻辑或事务中替代实现,更符合OO思想。
创建触发器
create trigger语句用来创建一个触发器,触发器的作用是当表上有对应SQL语句发生时,则触发执行
触发器创建时需要指定对应的表名tbl_name
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
mysql> HELP CREATE TRIGGER;
Name: 'CREATE TRIGGER'
Description:
Syntax:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
Definer关键词用来指定trigger的安全环境
Trigger_time指定触发器的执行时间, BEFORE和AFTER指定触发器在表中的每行数据修改前或者后执行
Trigger_event指定触发该触发器的具体事件
• INSERT当新的一行数据插入表中时触发,比如通过执行insert,loaddata,replace语句插入新数据
• UPDATE当表的一行数据被修改时触发,比如执行update语句时
• DELETE当表的一行数据被删除时触发,比如执行delete,replace语句时
当执行insert into … on duplicate key update语句时,当碰到重复行执行update时,则触发update下的触发器
从5.7.2版本开始,可以创建具有相同trigger_time和trigger_event的同一个表上的多个触发器,默认情况下按照创建的时间依次执行,通过指定FOLLOWS/PRECEDES改变执行顺序,即FOLLOWS时表示新创建的触发器后执PRECEDES则表示新触发器先执行
Trigger_body表示触发器触发之后要执行的一个或多个语句,在内部可以引用涉及表的字OLD.col_name表示行数据被修改或删除之前的字段数据, NEW.col_name表示行数据被插入或修改之后的字段数据
|
例:
查询触发器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mysql> select trigger_schema,trigger_name from information_schema.triggers;
+----------------+----------------------------+
| trigger_schema | trigger_name |
+----------------+----------------------------+
| course | simple_trigger |
| sys | sys_config_insert_set_user |
| sys | sys_config_update_set_user |
+----------------+----------------------------+
3 rows in set (0.00 sec)
trigger_schema: 哪个库
trigger_name : 触发器的名字
sys 库下面的触发器是默认就有的
查看触发器的详细信息
show create trigger course.simple_trigger
|
删除触发器
1 2 3 4 5 6 7 8 |
mysql> help drop trigger;
Name: 'DROP TRIGGER'
Description:
Syntax:
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
• If exists短语用来避免删除不存在的触发器时引发报错
• 当你执行drop table时,表上的触发器也被drop掉了
|