MYSQL8触发器

MYSQL8触发器简介

image.png


触发器的特性

image.png


触发器语法格式

image.png


数据准备

image.png


Before与After区别:

在MySQL 8中,触发器可以定义为在INSERT、UPDATE和DELETE语句执行之前(BEFORE)或之后(AFTER)自动执行的一组指令。

AFTER触发器是在数据插入、更新或删除操作已经完成之后执行的。它们通常用于记录日志或执行其他操作,这些操作可能需要在数据进行更改后才能执行。AFTER触发器还可以用于计算汇总值或执行其他聚合操作。

BEFORE触发器是在实际数据更改操作之前执行的。它们通常用于验证将要插入、更新或删除的数据是否符合特定的条件,以及在执行操作之前对其进行修改。BEFORE触发器还可以用于检查外键约束或确保数据的完整性。

因此,区别在于BEFORE触发器在执行实际数据更改操作之前执行,而AFTER触发器在执行完实际数据更改操作之后执行。

after:事件后执行,先完成业务增删改,然后再执行触发器语句触发器语句晚于监视业务的增删改。

  • 不能new进行修改。
  • after insert
  • after update
  • after delete

before:事件前执行,先完成触发器语句,再进行业务增删改触发语句先于监视业务的增删改。

  • (insert、update)可以new进行修改。
  • before insert
  • before update
  • before delete

两者都不能修改old数据。

after插入数据后记录


需求:

当user表添加一行数据,则会自动在user_log表中添加日志记录


实现代码

after insert中的 after 关键字表示:
触发器在插入业务数据操作之后触发执行。也就是说,当有新数据行被插入到指定的业务数据表时,该触发器会在这些数据行被成功插入后立即执行。

on user指定了触发器所绑定的数据表for each row表示对每一行数据都执行一次触发器操作。
image.png

-- 触发器
CREATE trigger trigger_test1 after insert
on user for each row
insert into user_logs values(null,now(),'有新用户添加');

image.png


before成功修改数据后记录


需求:

需求2: 当user表数据被修改时,则会自动在user_log添加日志记录


实现代码

before updatebefore表示在更新操作之前触发执行。
on user指定了触发器所绑定的数据表for each row表示对每一行数据都执行一次触发器操作。
image.png

-- 需求2: 当user表数据被修改时,则会自动在user_log添加日志记录
DELIMITER $$
-- before update表示数据被成功修改后记录
create trigger trigger_test2 before update
-- on user,表示绑定(坚实)user表
-- for each row ,表示每次变更都执行记录
on user for each row
BEGIN
    -- 当user表的数据被成功修改后,执行这段sql,往user_logs表中插入信息
    insert into user_logs values(null,now(),'有用户信息被修改');
END $$
DELIMITER;

NEW和OLD

NEW:新行
OLD:旧行
当在触发器中编写 INSERTUPDATEDELETE 语句时,“new” 和 “old” 分别代表触发器所针对的表中被修改(即被更新、插入或删除)的新行旧行

如果触发器是在 INSERT 操作之前被触发,那么 “new” 代表将要被插入到表中的新行

如果是在 UPDATEDELETE 操作之前被触发,那么 “old” 代表将要被更新或删除的行,而 “new” 代表更新后或者删除后将要被插入到表中的新行

MYSQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容:具体如下:

触发器类型触发器类型NEWOLD的使用
INSERTNEW表示将要或者已经新增的数据
UPDATEOLD表示修改之前的数据,NEW表示将要或已经修改后的数据
DELETEOLD表示将要或者已经删除的数据

使用方法:

NEW.相应数据表的列名

NEW示例:需求:记录添加的数据

-- NEW
-- after insert类型定义触发器:
-- after事后记录
CREATE trigger trigger_test3
after
insert on user for each row
insert into user_logs
values(
        null,
        now(),
        concat('有新用户添加,信息为:', NEW.uid, NEW.username, NEW.password)
    );

image.png


OLD示例:需求:记录修改前信息

-- OLD
-- 记录修改前的信息
CREATE trigger trigger_test4
after
update on user for each row
insert into user_logs
values(
        null,
        NOW(),
        concat(
            '有用户信息被修改',
            '信息修改前为:' OLD.uid,
            OLD.username.OLD.password
        )
    );

image.png


OLD示例:需求:记录删除信息

-- 记录删除信息
CREATE trigger trigger_test6
after delete on user for each row
insert into user_logs
values(
  null,
  NOW(),
  concat_ws(
          ',',
          '有用户被删除,被删除用户信息为:',
          OLD.uid,
          OLD.username,
          OLD.password
        )
);

image.png


查看触发器

-- 查看触发器
show triggers;

image.png


删除触发器

-- 删除触发器
drop trigger if exists 触发器名称;

触发器注意事项

image.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值