触发器(Trigger)是 Mysql 数据库中的一种特殊的存储过程,它会在数据库中的指定表上自动执行某些操作。当满足触发器定义的条件时,触发器会被触发并执行相应的操作。触发器可以用于实现数据的自动更新、数据的完整性约束等功能。
应用场景:
使用 show 或者 select 语句查看当前数据库中所有的触发器。
show triggers;
select * from information_schema.triggers;;
使用 create trigger 语句来创建一个触发器,语法如下:
create
[definer = user]
trigger [if not exists] trigger_name
trigger_time trigger_event
on tbl_name for each row
[trigger_order]
trigger_body
trigger_time: { before | after }
trigger_event: { insert | update | delete }
trigger_order: { follows | precedes } other_trigger_name
使用 drop trigger 语句删除该触发器。
drop trigger [if exists] [schema_name.]trigger_name;
其中,schema_name 是数据库的名称,可选项,trigger_name是要删除的触发器的名称。
准备工作:新建一个学生表和成绩表,创建一个触发器,用于在插入成绩数据时自动检查成绩是否合法。
create table if not exists students (
id int primary key,
name varchar(100),
age int,
gender varchar(10)
);
create table if not exists scores (
id int primary key,
student_id int,
subject varchar(100),
score int,
foreign key (student_id) references students(id)
);
# 创建触发器
create trigger check_score
before insert on scores
for each row
begin
if new.score < 0 or new.score > 100 then
signal sqlstate '45000' set message_text = 'invalid score';
end if;
end;
触发器逻辑是插入成绩数据之前检查成绩是否合法,如果成绩小于0或大于100,则触发器会抛出一个异常。
准备工作:新建订单表和库存表,创建一个触发器,当发生订单销售记录时,更新库存记录。
create table if not exists orders (
id int primary key,
product_id int,
quantity int
);
create table if not exists inventory (
id int primary key,
product_id int,
quantity int
);
# 创建触发器
create trigger update_inventory
after insert on orders
for each row
begin
update inventory set quantity = quantity - new.quantity where product_id = new.product_id;
end;
触发器会自动在插入订单数据之后自动更新库存表中的库存数量,实施数据同步更新操作。
准备工作:假设有文章表和文章日志表,创建一个触发器,用于在更新文章数据时自动记录更新日志。
create table articles (
id int primary key,
title varchar(100),
content text
);
create trigger log_update
after update on articles
for each row
begin
insert into article_logs (article_id, action, updated_at) values (old.id, 'update', now());
end;
这个触发器会在更新文章数据之后自动将更新日志插入到文章日志表中。
触发器也可以提高数据库的自动化程度,减少手动操作的工作量。也可以帮助我们记录操作日志,具体记录什么时间进行了什么操作。这可以帮助我们更好地还原操作时的具体场景,更好地定位到问题原因所在。