触发器是和表相关的一种数据库对象,可以将他看作一种特殊的存储过程,不需要人为调动的存储过程。
可以在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
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 ;
数据提供两个数据对象now和old分别记录新值和旧值;
inset 中new表示插入的新数据;
updata 中new表示新数据,old表示旧数据。
delete 中old表示的是删除的数据。
mysql 触发器都是保存在information_shema数据库中的,所以查询触发器需要查询information_shema数据库中的triggers表。
格式: use information_shema;
select * from triggers; # 查看所有触发器。
select *from triggers where trigger='触发器名'; #条件查询触发器。
show triggers from <数据库>; # 查看某个数据库中的触发器。
格式:drop trigger <触发器名>;
虽然触发器中不能使用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;
触发器中只要有一条语句出现错误,那么整个触发器以及触发此触发器的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");
与触发器类似,都是在特定条件下执行相应的操作,但触发器是在触发时才执行,而事件是让数据库定时实现某操作。
格式:
CREATE EVENT [IF NOT EXISTS]
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}
-- 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;
-- 每隔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)的,所以打开事件调度器才能执行事件管理
查看事件调度器的状态: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;
show event
-- 关闭某个事件
alter event event_test1 disable;
-- 打开
alter event event_test enable;
事件删除:
drop event ;
查看事件具体执行语句
show create event eventname;
以上仅是我在【六星教育】的学习笔记,仅供参考。如有任何错误,敬请指正。欢迎大家的评价与点评。谢谢!