MySQL触发器使用
触发器
触发器是一个特殊的存储过程,不同的是存储过程要用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掉了 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了