22. Mysql 触发器

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 22. Mysql 触发器

概念

触发器(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
  • 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 语句删除该触发器。

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;

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

总结

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

参考资料

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
45 0
|
4月前
|
SQL 数据采集 关系型数据库
|
5月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
108 0
|
5月前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
6月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
6月前
|
存储 SQL 关系型数据库
MySQL周内训参照4、触发器-插入-修改-删除
MySQL周内训参照4、触发器-插入-修改-删除
52 1
|
11天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
80 15
|
4天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
11天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
下一篇
DataWorks