MySQL--触发器和事件

触发器和事件

一、触发器

1、触发器的基本概念

​ 触发器是和表相关的一种数据库对象,可以将他看作一种特殊的存储过程,不需要人为调动的存储过程。

  1. 关键字:trigger
  2. 基本作用:通过对表进行数据的插入、更新或删除等操作来触发,从而执行某些特定的操作。

2、触发器的创建

可以在MySql命令界面通过’? create trigger '命令查看创建触发器的格式。

mysql> ? create trigger

Description:
Syntax:
CREATE
[DEFINER = user] – 用户名
TRIGGER trigger_name – 触发器名
trigger_time --触发时机

​ trigger_event – 触发条件
​ ON tbl_name --表名

​ FOR EACH ROW – 对每一行
​ trigger_body – 触发器所做的事情
---------------------------------------------------------------------------------------------
trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

This statement creates a new trigger. A trigger is a named database
object that is associated with a table, and that activates when a
particular event occurs for the table. The trigger becomes associated
with the table named tbl_name, which must refer to a permanent table.
You cannot associate a trigger with a TEMPORARY table or a view.

Trigger names exist in the schema namespace, meaning that all triggers
must have unique names within a schema. Triggers in different schemas
can have the same name.

创建触发器的基本格式:
create TRIGGER ON tbl_name FOR EACH ROW

3、触发器的使用

  1. 使用触发器实现检查约束。
create database db_3;
create table test_tb(
id int primary key auto_increment,
test_name varchar(20) not null,
test_age int)auto_increment = 100;
# 创建触发器实现,规定年龄的取值范围必须在0~100之间。
delimiter //
create trigger tri_test
before insert on test_tb
for each row
begin
	if test_age >100 then set new.test_age = 100;
	else test_age <0 then set new.test_age = 0;
	end if;
end//
delimiter ;

3、new对象和old对象

​ 数据提供两个数据对象now和old分别记录新值和旧值;

​ inset 中new表示插入的新数据;

​ updata 中new表示新数据,old表示旧数据。

​ delete 中old表示的是删除的数据。

4、查看数据库中的触发器

mysql 触发器都是保存在information_shema数据库中的,所以查询触发器需要查询information_shema数据库中的triggers表。

格式: use information_shema;

select * from  triggers;	# 查看所有触发器。

select *from triggers where trigger='触发器名';	#条件查询触发器。

show triggers from <数据库>;	# 查看某个数据库中的触发器。

5、删除触发器

格式:drop trigger <触发器名>;

6 、触发器的使用限制

  1. 触发器中不能使用存储过程和函数,也不能使用select和call等动态的sql语句,改变表结构。
  2. 触发器 中不能使用开始和结束事务。
  3. 触发器不能写的太复杂,否则每改变一行,所执行的任务就太多了。

7、突破触发器的使用限制

虽然触发器中不能使用select查询数据,不能直接通过参数返回,但是可以通过用户变量带回数据。

create trigger tri_test
after insert on   for each row
begin
select new.<属性> from  
where new.<属性> = valare into @变量;
end;
select @变量;

select "错误" into @information;	-- 没有结果集的返回
 
 select @information;
 
 select 'aaa','bbbb' into @a,@b;
 select @a;
 

8、触发器的注意事项

触发器中只要有一条语句出现错误,那么整个触发器以及触发此触发器的sql语句不会执行。

触发器的使用示例

-- 使用触发器制作日志
-- 日志:对某些操作/事件的记录。
/* 1.创建日志表*/
create table review(
id int primary key auto_increment,
    user_name varchar(20),-- 用户名
    database_name varchar(20), -- 数据库名
    table_name varchar(30), -- 数据表名
    action_time datetime, -- 操作时间。
    action_name varchar(10),-- 操作名称。
)
-- 2.创建触发器实现日志的记录
create trigger tri_test_insert
after insert
on test_tb
for each row 
insert into review(user_name,database_name, table_name,action_time,action_name) 
values(user(),database(),"test_tb",now(),"insert");

二、事件

​ 与触发器类似,都是在特定条件下执行相应的操作,但触发器是在触发时才执行,而事件是让数据库定时实现某操作。

1. 事件的创建 event

格式:
CREATE EVENT [IF NOT EXISTS] ON SCHEDULE DO ;

mysql> ? create event
Name: ‘CREATE EVENT’ – event的使用方法
Description:
Syntax:
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT ‘string’]
DO event_body;

schedule: {
AT timestamp [+ INTERVAL interval] …
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] …]
[ENDS timestamp [+ INTERVAL interval] …]
}

interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

示例1

-- This is an example of a minimal CREATE EVENT statement:

CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;

示例2

-- 每隔10s向表中插入一个数据
-- 创建测试表
create even_test_tb(
id int primary key auto_increment,
insert_time datetime);
create event event_test1
on schedule every 10 second
do
insert into even_test_tb(insert_time) values(now());

事件调度器:某些时候事件没有执行,这是就需要查询事件的执行状态,

show event --查询所有事件状态。

-- 关闭某个事件 alter event event_test disable ;

-- 打开某个事件 alter event event_test enable;

事件调度器 scheduler

​ 所有事件都是由事件调度器管理(scheduler)的,所以打开事件调度器才能执行事件管理

查看事件调度器的状态:show variable 会话变量(variable) 查看会话变量。# 事件调度器是一个会话

查看事件调度器show variables like'%scheduler%';

关闭事件调度器:set global[会话变量] event_scheduler = off / 0

打开事件调度器:set global event_scheduler = 1 / on

事件调度器开始后是由一个进程来执行的,

查看进程列表:show processlist;

-- 创建一个清空表数据的事件,每个二分钟清空表event_test_tb
create event event_test_tb
on schedule every 2 minute
starts now()||current_timestamp()+interval 1 minute
ends current_timestamp+interval 5 minute-- 5分钟后结束
on completion not preserve -- 事件停止后不保留(删除)事件
do  truncate table event_test_tb; -- 清空表数据
|| delete from event_test_tb;
-- 创建一个清空表数据的事件,固定时间点清空表数据
create event event_test1
on schedule at"23:00:00"+interval 1 day-- 固定点执行事件
on completion not preserve -- 事件停止后不保留(删除)事件
do  truncate table event_test_tb; -- 清空表数据
|| delete from event_test_tb;

3、查看事件执行状态:show event

4、设置事件的状态

-- 关闭某个事件
alter event event_test1 disable;
-- 打开
alter event event_test enable;

事件删除:

drop event ;

查看事件具体执行语句

show create event eventname;

以上仅是我在【六星教育】的学习笔记,仅供参考。如有任何错误,敬请指正。欢迎大家的评价与点评。谢谢!

你可能感兴趣的:(数据库,mysql,sql,数据库)