09 MySQL触发器

什么是触发器
触发器是在插入、更新、删除前后自动执行的一堆代码

通常用来增强数据的一致性

创建触发器
delimiter $$
create trigger 触发器名 after/before insert/delete/ on 表名 for each row(触发器级别)
begin
end $$
delimiter ;
 
其他可能用到的关键字

NEW:返回更新后的行以及相对应的数值
OLD:返回更新前的行以及对应的数值
delimiter $$
create trigger test after delete on payments
for each row
begin
update invoices
set payment_total = payment_total - OLD.amount
where invoice_id = old.invoice_id;
end $$

delimiter ;
 
可以遵循一些命名规则:

表名-之前或者之后-sql语句的类型

table-after-insert

查看触发器
show triggers
 
这也是个表达式,也可以用一些筛选语句

删除触发器
drop trigger if exists 触发器
 
使用触发器进行审计
触发器的另一个常见用途是为了之后审计的目的而记录对数据库的修改

比如我们现在新创了一张表用于记录操作

那么我们可以在我们上面那个触发器里加入一些东西

delimiter $$
create trigger test after delete on payments
for each row
begin
update invoices
set payment_total = payment_total - OLD.amount
where invoice_id = old.invoice_id;

insert into payments_audit
values(old.client_id, old.date, old.amount, 'Delete', now());
end $$

delimiter ;
 
delimiter $$
create trigger test after insert on payments
for each row
begin
update invoices
set payment_total = payment_total - new.amount
where invoice_id = new.invoice_id;

insert into payments_audit
values(new.client_id, new.date, new.amount, 'Delete', now());
end $$

delimiter ;
 
事件
事件可以用来在特定的时间周期内或者就执行一次来让数据库自动执行的sql语句

delimiter $$
create event 时间_动作_操作名称
on schedule (at 'date' 如果仅执行一次就写at)
every hour/day/year.. starts date ends date
do begin
sql_language
end $$
 
查看删除更改事件
查看
show events;
 
删除
drop events if exists 名字
 
更改
alter event ...与create类似

delimiter $$
alter event 时间_动作_操作名称
on schedule (at 'date' 如果仅执行一次就写at)
every hour/day/year.. starts date ends date
do begin
sql_language
end $$
 
还可以更改是否启动

alter event 名字 enable/disabl
————————————————
版权声明:本文为CSDN博主「INGg__」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/INGg__/article/details/117219238

原文地址:https://www.cnblogs.com/javalinux/p/15001229.html