MYSQL8触发器

MYSQL8触发器

    • MYSQL8触发器简介
      • 触发器的特性
      • 触发器语法格式
      • 数据准备
    • Before与After区别:
    • `after`插入数据后记录
      • 需求:
      • 实现代码
    • `before`成功修改数据后记录
      • 需求:
      • 实现代码
    • NEW和OLD
      • 使用方法:
      • NEW示例:需求:记录添加的数据
      • OLD示例:需求:记录修改前信息
      • OLD示例:需求:记录删除信息
    • 查看触发器
    • 删除触发器
    • 触发器注意事项

MYSQL8触发器简介


触发器的特性

MYSQL8触发器_第1张图片


触发器语法格式

MYSQL8触发器_第2张图片


数据准备

MYSQL8触发器_第3张图片


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表示对每一行数据都执行一次触发器操作。
MYSQL8触发器_第4张图片

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

MYSQL8触发器_第5张图片


before成功修改数据后记录


需求:

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


实现代码

before updatebefore表示在更新操作之前触发执行。
on user指定了触发器所绑定的数据表for each row表示对每一行数据都执行一次触发器操作。
MYSQL8触发器_第6张图片

-- 需求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的使用
INSERT NEW表示将要或者已经新增的数据
UPDATE OLD表示修改之前的数据,NEW表示将要或已经修改后的数据
DELETE OLD表示将要或者已经删除的数据

使用方法:

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)
    );


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
        )
    );

MYSQL8触发器_第7张图片


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
        )
);

MYSQL8触发器_第8张图片


查看触发器

-- 查看触发器
show triggers;

MYSQL8触发器_第9张图片


删除触发器

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

触发器注意事项

MYSQL8触发器_第10张图片

你可能感兴趣的:(数据库,sql)