触发器是由事件来触发某个操作,这些事件包括insert语句、update语句、delete语句,当数据库系统执行这些事件时,就会激活触发器执行相应的操作。
事件调度器(event schedule)用作定时执行某些特定任务来取代原先只能由操作系统的计划任务来执行的工作。
一、触发器
1. 创建触发器
create trigger trigger_name trigger_time trigger_event on table_name for each row trigger_statement;
参数 | 参数值 | 说明 |
---|---|---|
trigger_statement | sql语句 | 执行语句,可放在begin…end中 |
trigger_name | string | 触发器名称 |
trigger_time | {before | after} |
表示在事件之前、之后激活触发器 |
trigger_event | {insert | update | delete} |
表示触发事件,insert语句、load data语句、replace语句都能触发insert事件,update语句能触发update事件,delete、replace语句能触发delete事件 |
2. 查看触发器
-- 法一:显示所有的触发器
show triggers;
-- 法二:若省略where子句也显示所有的触发器
select * from information_schema.triggers[ where trigger_name = trigger_name];
3. 删除触发器
drop trigger [database_name.]trigger_name;
其中,若省略database_name,则删除当前数据库的触发器。
4. 说明
- 对于同一个表,不能存在两个相同的触发时间和事件的触发器。
- 触发器不能调用将数据返回客户端的存储程序,也不能采用call语句的动态SQL。
- 触发器针对行来操作,对大数据集的效率较低。
- 使用OLD、NEW可用访问受影响行的列。OLD列为只读,不可修改。在before触发器中,auto_increment列的new值为0。
触发器 | 访问影响的行的列 |
---|---|
INSERT触发器 | new.col_name |
DELETE触发器 | old.col_name |
UPDATE触发器 | old.col_name, new.col_name |
BEFORE触发器 | 当具有update权限时,可用set new.col_name=value; |
5. 例子
5.1 创表
-- 创建product表
create table product (
id INT(10) not null unique primary key,
name varchar(20) not null,
function varchar(50) ,
company varchar(20) not null
address varchar(50)
);
-- 创建operate表
create table operate (
op_id int(10) not null unique primary key auto_increment,
op_name varchar(20) not null
op_tiem time not null
);
5.2 添加触发器
在product表上分别创建BEFORE INSERT、AFTER UPDATE和AFTER DELETE3个触发器,触发器的名称分别为Tproduct_bf_insert、Tproduct_af_update和Tproduct_af_del。执行语句部分都是向operate表插入操作方法和操作时间。
create trigger Tproduct_bf_insert before insert on product for each row
insert into operate values(null, 'Insert product', now());
create trigger Tproduct_af_update after update on product for each row
insert into operate values(null, 'Update product', now());
create trigger Tproduct_af_delete after delete on product for each row
insert into operate values(null, 'Delete product', now());
5.3 执行操作
对product表分别执行INSERT、UPDATE和DELETE操作,分别查看operate表。
-- 插入
insert into product values(1, 'abc','治疗感冒', '北京abc制药厂','北京市昌平区');
-- 更新
update product set address='北京市海淀区' where id = 1;
-- 删除
delete from product where id = 1;
二、事件
1. 使用事件之前
使用之前需要确保event_scheduler为开启状态。
-- 查看状态
show variables like 'event_scheduler';
-- 开启
set global event_scheduler = on;
2. 创建事件
create event [if not exists] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT 'string'] DO sql_statement;
参数 | 参数值 | 说明 |
---|---|---|
event_name | string | 事件名称同一个数据库不能有相同的事件名称 |
sql_statement | sql语句 | SQL执行语句 |
schedule | AT timestamp [+ INTERVAL interval] | EVERY interval [STARTS timestamp] [ENDS timestamp] |
表示计划任务的方式(AT或EVERY),其后的时间戳可以是任意的timestamp、datetime数据类型 |
3. 查看事件
show events;
show create event event_name;
4. 修改事件
alter event event_name [ON SCHEDULE schedule] [RENAME TO new_name] [ON COMPLENTION [NOT] PRESERVE] [COMMENT 'string'] [ENABLE | DISABLE] [DO sql_statement]
4.1 开启事件
alter event event_name enable;
4.2 关闭事件
alter event event_name disable;
关闭事件后,若重启MySQL服务器,则事件会被删除。
5. 删除事件
drop event [if exists] event_name;