MySQL触发器使用

触发器

触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL

也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。 
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。 
作用

  1. 触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。

  2. 触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。

  3. 触发器还可以强制执行业务规则

  4. 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

实际应用 
尽管触发器有很多优点,但是在实际的项目开发中,特别是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掉了

posted on   数据与人文  阅读(11)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示