22. Mysql 触发器

简介: 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;

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

总结

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

参考资料

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
11月前
|
监控 关系型数据库 MySQL
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
272 0
|
SQL 数据采集 关系型数据库
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
367 0
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
存储 关系型数据库 MySQL
MySQL触发器实战:自动执行的秘密
MySQL触发器实战:自动执行的秘密
369 3
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

推荐镜像

更多