一.触发器
1.触发器的基本概念
触发器是和表相关联的一种数据库对象,可以将它看作一种特殊的存储过程,可以理解为不需要人为调 用的存储过程。 ①触发器关键字:trigger ②基本作用:通过对表进行数据的插入、更新或删除等操作来触发,用于执行某些特定的操作。
2.触发器的创建
可以在mysql 命令界面通过? create trigger 命令查看创建触发器的格式。 创建触发器的基本格式
CREATE TRIGGER trigger_name
trigger_time
trigger_event
ON tbl_name
FOR EACH ROW
trigger_body
总的来说就是对表中的某一行进行插入、删除、更新时触发某一触发器来执行某些操作。
参数解析:
① 触发条件 insert:在插入表的时候触发 update:在更新表的时候触发 delete:在删除表的时候触发 ② 触发时机 before:在…之前 after:在…之后
举例1:利用触发器实现检查约束 对表格创建一个触发器,规定年龄属性的取值范围在0~100之间,年龄不能低于0岁,不能高于10岁
create table trigger_test_tb(
id int primary key auto_increment,
test_name varchar(20),
test_age int
);
delimiter
create trigger tri_test_insert
before insert on trigger_test_tb for each row
begin
if new.test_age < 0 then set new.test_age = 0;
elseif new.test_age > 100 then set new.test_age = 100;
end
delimiter ;
select * from trigger_test_tb;
insert into trigger_test_tb values(null,'张三',18);
insert into trigger_test_tb values(null,'李四',20), (null,'王五',-10),(null,'王五',101);
3.new 对象和old 对象
数据库提供了两个数据对象new和old分别记录新值和旧值。 例如:update更新数据时会把新的数据覆盖之前的数据,那new对象就是保存新数据,而old对象是保存被覆盖之前的数据。 那么相对于insert而言是没有old的,因为插入之前是没有旧数据,相对于delete而言是没有new的,因为只删除原来存在的数据,不添加新数据。 insert 插入数据时,new 表示插入的数据 update 更新数据时,new 表示新的数据,old表示的是原数据 delete 删除数据时,old 表示的是删除的数据
4.查看数据库中的触发器
查看触发器的基本格式:
show triggers from 数据库名;
5.查看所有触发器
mysql 触发器都是保存在information_shema.triggers 表中的,所以查看触发器需要查询information_shema 数据库中的trigger 表。
use information_shema;
select * from triggers;
select * from triggers where trigger_name='触发器名';
6.触发器的使用限制
6.1触发器中不支持使用select、create和call等动态SQL语句,如:
delimiter
create trigger tri_test_select
after insert on trigger_test_tb for each row
select * from trigger_test_tb where id = new.id;
6.2 利用用户变量突破触发器的使用限制,如:
create trigger tri_test_select
after insert on trigger_test_tb for each row
select id from trigger_test_tb where id = new.id into @id;
insert into trigger_test_tb values(null,'赵六',-1);
select * from trigger_test_tb; select @id;
select * from trigger_test_tb where id = @id;
7.删除触发器
drop trigger 触发器名;
二.事件
1.事件的基本概念
与触发器类似,都是在特定的条件执行相应的操作,但是不同的是,触发器是触发时执行某些任务,而事件是定时执行某些任务。 ①事件的关键字: event ②事件的基本作用:让数据库定时执行某些操作。
2.事件的创建
创建事件的基本格式 可以通过? create event 命令查看创建事件的格式。如:
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
(定时操作:AT timestamp 时间点,EVERY interval 间隔多久)
[ON COMPLETION [NOT] PRESERVE]
(事件执行完之后默认保留,加一个NOT为删除)
[ENABLE | DISABLE | DISABLE ON SLAVE]
(开启 | 关闭)
[COMMENT 'string']
DO event_body;
参数解析
schedule:
AT timestamp [+ INTERVAL interval] ...
(如:AT 2021-6-6 8:30:10,2021年6月6号8点30分10秒)
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
[开始时间 [+ 时间间隔]]
[结束时间 [+ 时间间隔]]
举例2:用事件实现每6秒钟向表中插入数据
create table event_test_tb(
id int primary key auto_increment,
insert_time time
);
create event insert_event
on schedule every 6 second
do
insert into event_test_tb values(null,second(now()));
select * from event_test_tb;
如果事件没有执行效果,则是事件被关闭或者事件调度器未打开。
3.事件的打开与关闭
alter event 事件名 disable;
alter event 事件名 enable;
如果将事件打开后事件仍然没有执行,那一般是事件调度器没有打开。
4.事件调度器的打开与关闭
show variables like '%SCHEDULE%';
set global event_scheduler = off;
set global event_scheduler = 0;
set global event_scheduler = on;
set global event_scheduler = 1;
show processlist;
5.事件小练习
创建一个清空表事件,5天之后开启事件,每小时清空表数据,一个月后停止事件并不保留事件。
create event delete3_event
on schedule every 1 hour
starts current_timestamp() + interval 5 day
ends current_timestamp() + interval 1 month
on completion not preserve
do
truncate table event_test_tb;
6.查看所有事件的状态
show events;
7.删除事件
drop event 事件名;
8.查看事件的具体执行语句
show create event 事件名;
9.数据库中时间单位
year、month、 day、 week、 hour、 minute、 second、 microsecond
|