22. Mysql 触发器

文章目录

概念

触发器(Trigger)是 Mysql 数据库中的一种特殊的存储过程,它会在数据库中的指定表上自动执行某些操作。当满足触发器定义的条件时,触发器会被触发并执行相应的操作。触发器可以用于实现数据的自动更新、数据的完整性约束等功能。

应用场景:

  • 数据完整性约束:通过触发器可以实现对表中数据的完整性约束,例如,可以在插入或更新数据时自动检查数据的合法性。
  • 数据同步:可以在一个表上的操作触发时,自动将数据同步到其他相关的表中。
  • 日志记录:可以在对表进行插入、更新或删除操作时,自动记录操作日志。
  • 数据备份:可以在对表进行插入、更新或删除操作时,自动将数据备份到其他表或文件中。

常见操作

查看触发器

使用 show 或者 select 语句查看当前数据库中所有的触发器。

sql 复制代码
show triggers;
select * from information_schema.triggers;;

创建触发器

使用 create trigger 语句来创建一个触发器,语法如下:

sql 复制代码
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
  • trigger_name:触发器的名称。
  • trigger_time:指定触发器的执行时间,可以是 before 或 after。
  • trigger_event:指定触发器的事件,可以是 insert、update 或 delete。
  • table_name:指定触发触发器的表名。
  • for each row:固定语法,表示触发器的每一行数据都会被触发。
  • trigger_order:可选,指定触发器顺序,可以是 follows(之后) 或 precedes(之前)激活。
  • trigger_body:触发器的具体执行逻辑,如果包含多条语句,可以使用 begin ... end 复合结构。

删除触发器

使用 drop trigger 语句删除该触发器。

sql 复制代码
drop trigger [if exists] [schema_name.]trigger_name;

其中,schema_name 是数据库的名称,可选项,trigger_name是要删除的触发器的名称。

精选示例

数据完整性约束

准备工作:新建一个学生表和成绩表,创建一个触发器,用于在插入成绩数据时自动检查成绩是否合法。

sql 复制代码
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,则触发器会抛出一个异常。

数据同步

准备工作:新建订单表和库存表,创建一个触发器,当发生订单销售记录时,更新库存记录。

sql 复制代码
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;

触发器会自动在插入订单数据之后自动更新库存表中的库存数量,实施数据同步更新操作。

日志记录

准备工作:假设有文章表和文章日志表,创建一个触发器,用于在更新文章数据时自动记录更新日志。

sql 复制代码
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;

这个触发器会在更新文章数据之后自动将更新日志插入到文章日志表中。

总结

触发器也可以提高数据库的自动化程度,减少手动操作的工作量。也可以帮助我们记录操作日志,具体记录什么时间进行了什么操作。这可以帮助我们更好地还原操作时的具体场景,更好地定位到问题原因所在。

参考资料

相关推荐
m0_748244831 小时前
StarRocks 排查单副本表
大数据·数据库·python
C++忠实粉丝1 小时前
Redis 介绍和安装
数据库·redis·缓存
wmd131643067121 小时前
将微信配置信息存到数据库并进行调用
数据库·微信
是阿建吖!1 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库
凡人的AI工具箱2 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
ClouGence2 小时前
Redis 到 Redis 数据迁移同步
数据库·redis·缓存
m0_748236582 小时前
《Web 应用项目开发:从构思到上线的全过程》
服务器·前端·数据库
苏三说技术2 小时前
Redis 性能优化的18招
数据库·redis·性能优化
Tttian6222 小时前
基于Pycharm与数据库的新闻管理系统(2)Redis
数据库·redis·pycharm
做梦敲代码3 小时前
达梦数据库-读写分离集群部署
数据库·达梦数据库