【MySQL数据库】触发器与事件

MySQL触发器

trigger,在表的插入insert、更新update、删除delete操作发生时自动执行MySQL语句。

学过Qt的都知道信号槽,一旦发出某个信号,那么就会触发关联的信号槽函数。触发器就类似于这个操作。

创建触发器时需要给出一些信息:

        触发器名

        在操作前还是操作后触发(before/after)

        被什么操作触发(insert/update/delete)

        被哪个表的操作触发

在MySQL中,触发器采用类似存储过程的语法进行定义,包括触发条件、触发事件、以及触发后执行的SQL语句等:

create trigger myTrigger 
[after|before] [insert|update|delete]
on table_name
begin
    -- coding
end;

每当表table_name进行操作时,在这之前(之后)执行器会自动执行myTrigger触发器内部的coding。不同的操作也有一定的差异:

        insert:可通过new访问被插入的行,before insert可以更新new中的值(即允许更改被插入的值)。

        delete:可通过old访问被删除的行,old中的值是只读的,因为他即将被删除/已经被删除,现在只是临时保存到old中。

        update:old可以访问更新前的值,new访问更新后的值。

Tips:总结得出insert没法访问old、delete没法访问new、update全能访问。

其它操作:

-- 查看触发器
show triggers;
-- 查看指定表的触发器
show triggers like 'table_name';

--查看触发器的创建语句
show create trigger trigger_name;

-- 删除触发器
drop trigger [if exists] 触发器名;

练习:需求-更新部门,对应部门的员工涨100元工资

-- 第一步:创建触发器
create trigger up_sal  after update on dept
begin
    update emp 
    set sal=sal+100 where emp.deptno=old.deptno;
end;

-- 第二步:更新部门
update dept
set dname="newDept" where deptno=20;

-- 第三步:查询员工信息,发现涨工资了
select * from emp;

作业:需求-给部门表添加员工数量字段,员工表添加员工时对应部门的员工数量自动加1

第一步:dept表添加一个字段:员工数量

alter table dept
add enum int default 0;

第二步:部门表的员工数量更新为正确值

update dept
set enum = (select count(*) from emp where emp.deptno=dept.deptno);

第三步:创建触发器,员工表添加员工时,对应部门员工数量加一

create trigger refresh_enum after insert on emp
begin
    update dept
    set enum=enum+1 where deptno=new.deptno;
end;

第四步:员工表添加员工测试一下。(自己来吧)

总结:通过使用触发器,可以在数据库层面实现一些复杂的业务逻辑,确保数据的一致性和完整性。然而,过多的触发器可能会影响数据库性能,因此在设计时需谨慎考虑。


MySQL事件

MySQL事件是一种在数据库中创建、调度和执行计划任务的机制。通过使用事件,用户可以定期执行特定的SQL语句或存储过程,从而自动化数据库管理和维护任务。

MySQL事件机制的主要组成部分包括以下内容:

1. 事件调度器:事件调度器是MySQL中用于管理和执行事件的组件。用户可以通过事件调度器创建新的事件、修改已有的事件、启用或禁用事件,并查看事件执行的状态和日志信息。

2. 事件对象:事件对象是用户定义的一个具体任务或操作,可以是一个SQL语句、存储过程或函数。用户可以在创建事件时指定要执行的具体操作,并设置事件的调度时间和频率。

3. 事件时间表:事件时间表是与事件相关的调度时间和频率的设置。用户可以在创建事件时指定事件的执行时间表,包括事件的开始时间、结束时间、执行间隔等。

通过使用MySQL事件机制,用户可以实现诸如定时备份数据库、定期清理过期数据、定时生成报表等自动化任务,从而提高数据库管理的效率和可靠性。

创建语句:

create event event_name
on schedule _schedule_
do
event_body;

 event_name:事件名称;_schedule_:执行计划;event_body:自动执行的语句。

需求:创建一个定时事件,每1小时执行一次任务,任务为:删除用户表中注册时间早于30天前的用户数据

create event event_clean_expired_data
on schedule every 1 hour
do
delete from users where register_time < now() - interval 30 day;

特别注意:在MySQL中,事件必须处于激活态才能执行。默认情况下,新建的事件不会自动启动事件调度器,需要通过命令开始事件调度器:

set global event_scheduler = on;

触发器与事件的区别

触发器和事件给我的第一感觉就很像,但他们确实是MySQL的两种不同的机制。经过查阅相关资料,总结出了以下几点:

相似之处:

        事件和触发器都是MySQL中的一种数据对象

        它们都是作为一组SQL语句,可以定时或触发执行

        它们都可以自动完成一些常规的事务操作。

不同之处:

        语法结构不同:这点看上面的创建语句就可以知道了

        触发方式不同:

                事件按照预定的时间表自动触发执行

                触发器在特定的数据表上进行增删改等操作时触发执行

        作用范围不同:

                事件是针对整个数据库的

                触发器通常只作用于单个表(或者服务器全局、schema级)

        功能上的差异:

                事件可以完成归档、日志记录、调度管理、定期的数据清理、备份、统计等任务;

                触发器没有这些高级功能,触发器通常用来进行验证、约束、自动化处理。


感谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值