在MySQL 8中,触发器可以定义为在INSERT、UPDATE和DELETE语句执行之前(BEFORE)或之后(AFTER)自动执行的一组指令。
AFTER
触发器是在数据插入、更新或删除操作已经完成之后
执行的。它们通常用于记录日志或执行其他操作,这些操作可能需要在数据进行更改后才能执行。AFTER触发器还可以用于计算汇总值或执行其他聚合操作。
BEFORE
触发器是在实际数据更改操作之前
执行的。它们通常用于验证将要插入、更新或删除的数据是否符合特定的条件,以及在执行操作之前对其进行修改。BEFORE触发器还可以用于检查外键约束或确保数据的完整性。
因此,区别在于BEFORE触发器在执行实际数据更改操作之前执行,而AFTER触发器在执行完实际数据更改操作之后执行。
after:事件后执行
,先完成业务增删改
,然后再执行触发器语句
,触发器语句
晚于监视业务
的增删改。
不能
对new
进行修改。before:事件前执行
,先完成触发器语句
,再进行业务增删改
,触发语句
先于监视业务
的增删改。
可以
对new
进行修改。两者都不能
修改old
数据。
after
插入数据后记录当user表添加一行数据,则会自动在user_log表中添加日志记录
after insert
中的 after
关键字表示:
触发器在插入业务数据操作之后
触发执行。也就是说,当有新数据行被插入到指定的业务数据表时,该触发器会在这些数据行被成功插入后
立即执行。
on user
指定了触发器所绑定的数据表
,for each row
表示对每一行数据都执行一次
触发器操作。
-- 触发器
CREATE trigger trigger_test1 after insert
on user for each row
insert into user_logs values(null,now(),'有新用户添加');
before
成功修改数据后记录需求2: 当user表数据被修改时,则会自动在user_log添加日志记录
before update
,before
表示在更新操作之前
触发执行。on user
指定了触发器所绑定的数据表
,for each row
表示对每一行数据都执行一次
触发器操作。
-- 需求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:旧行
当在触发器中编写 INSERT
、UPDATE
或 DELETE
语句时,“new
” 和 “old
” 分别代表触发器所针对的表中被修改(即被更新、插入或删除)的新行
和旧行
。
如果触发器是在 INSERT
操作之前被触发,那么 “new
” 代表将要被插入到表中的新行
。
如果是在 UPDATE
或 DELETE
操作之前被触发,那么 “old
” 代表将要被更新或删除的行
,而 “new
” 代表更新后或者删除后将要被插入到表中的新行
。
MYSQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容:具体如下:
触发器类型 | 触发器类型NEW 和OLD 的使用 |
---|---|
INSERT |
NEW 表示将要或者已经新增的数据 |
UPDATE |
OLD 表示修改之前的数据,NEW 表示将要或已经修改后的数据 |
DELETE |
OLD 表示将要或者已经删除的数据 |
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
-- 记录修改前的信息
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
)
);
-- 记录删除信息
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
)
);
-- 查看触发器
show triggers;
-- 删除触发器
drop trigger if exists 触发器名称;