当前位置: 代码迷 >> 综合 >> MySQL8.0学习笔记(9)—— trigger,event
  详细解决方案

MySQL8.0学习笔记(9)—— trigger,event

热度:88   发布时间:2023-11-27 23:43:56.0

文章目录

  • TRIGGER
    • 简介
    • 创建Trigger
    • 显示Trigger
    • 删除Trigger
    • log changes
  • EVENT
    • 查询event
    • 设置event开闭
    • 创建一个event
    • 显示event
    • 删除事件
    • 使能和失能事件

TRIGGER

简介

trigger(触发器)是在对一个表进行修改操作之前(或者之后)自动执行的一块sql语言块,对除本身的其它表进行操作的一种方法

创建Trigger

  • 当对payments进行插入操作后自动计算invoice的payment_total。
DELIMITER $$
drop trigger if exists payments_after_insert;
create trigger payments_after_insert-- afer可以替换成before,insert也可以替换成update,table可以为除它本身的所有表after insert on payments-- 对插入的每一行都执行操作for each row
beginupdate invoices-- new代表新插入的数据,可以用old代表原来的数据set payment_total = payment_total + new.amountwhere invoice_id = new.invoice_id;insert into payments_auditvalues(new.client_id,new.date,new.amount,'Insert',Now());
end $$
DELIMITER $$ ;

显示Trigger

  • 显示所有的trigger
show trigger
  • 显示单张表的trigger
show trigger like  'payments%'

删除Trigger

drop trigger if exists payments_after_insert;

log changes

可以利用trigger来记录更改的数据

创建一个表用于记录数据的变更

use sql_invoicing;
create table payments_audit
(client   	int      		not null,date     	date     		not null,amount   	decimal(9,2) 	not null,action_type	varchar(50)		not null,action_date	datetime		not null
)
  • 修改之前的trigger
use sql_invoicing;
DELIMITER $$
drop trigger if exists payments_after_insert;
create trigger payments_after_insert-- afer可以替换成before,insert也可以替换成update,table可以为除它本身的所有表after insert on payments-- 对插入的每一行都执行操作for each row
beginupdate invoices-- new代表新插入的数据,可以用old代表原来的数据set payment_total = payment_total + new.amountwhere invoice_id = new.invoice_id;insert into payments_auditvalues(new.client_id,new.date,new.amount,'Insert',Now());
end $$
DELIMITER $$ ;

EVENT

event是用于在规定时刻做出操作的的代码块,比如删除,拷贝备份等操作,event在后台运行

查询event

show variables like 'event%'

设置event开闭

set globle event_scheduler = on		//关闭为off

创建一个event

  • 创建一个事件,每年都清除payments_audit去年的数据
delimiter $$
create event yearly_delete_stale_audit_rows
on schedule
-- at '2019-05-01'	只执行一次every 1 year starts '2019-01-01' ends '2029-01-01'
do begindelete from payments_auditwhere action_date < now() - interval 1 year;
end $$
delimiter ;

显示event

show events;
//跟事件名
show event like 'yearly%'

删除事件

drop event if exists yearly_delete_stale_audit_rows

使能和失能事件

alter event yearly_delete_stale_audit_rows disable;
alter event yearly_delete_stale_audit_rows enable;
  相关解决方案