MySQL 触发器

目录

一、触发器概述

二、触发器操作

1、创建触发器

2、查看触发器

3、删除触发器

三、触发器应用


一、触发器概述

MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由时间来触发某个操作,这些时间包括INSERT、UPDATE和DELETE语句。如果定义了触发程序,当数据执行这些语句的时候就会激发触发器执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发器(trigger)是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句调用,也不需要手工启动,只要当一个预定义ide事件发生的时候,就会被MySQL自动调用。

触发器也可以查询其他表,而且可以包含复杂的SQL语句,它们主要用于满足复杂的业务规则或要求。

触发程序优点:

1)触发程序的执行过程是自动的。当触发程序相关表的数据做出相应的修改后立即执行。

2)触发程序可以通过数据库中相关的表进行层叠修改另表的表。

3)触发程序可以实现实施比FOREIGN KEY约束,CHECK约束更为复杂的检查和操作。

二、触发器操作

1、创建触发器

语法

sql 复制代码
create trigger 触发器名 触发时机<before|after> 触发事件<insert|update|delete>
on 表名 for each row 
begin
触发器程序体
end

2、查看触发器

语法1

sql 复制代码
show triggers;

语法2

sql 复制代码
select * from INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME='触发器名' \G

3、删除触发器

语法

sql 复制代码
drop trigger [数据库名.]触发器名

三、触发器应用

例如基于此素材

sql 复制代码
mysql> create table student(
    -> id int auto_increment primary key,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into student(name) values ('xiaoming'),('xiaogang');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from student;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
+----+----------+
1 row in set (0.00 sec)

mysql> select * from student_total;
+-------+
| total |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

1、创建插入触发器,在student表中插入数据,然后studen_total表中自动加一。

sql 复制代码
mysql> delimiter $$
mysql> create trigger student_insert_trigger after insert
    -> on student for each row
    -> begin
    -> update student_total set total=total+1;
    -> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

2、创建一个删除触发器,在student表中删除数据,然后student_total表的total自动减一。

sql 复制代码
mysql> delimiter $$
mysql> create trigger student_delete_trigger after delete
    -> on student for each row
    -> begin
    -> update student_total set total=total-1;
    -> end$$
Query OK, 0 rows affected (0.02 sec)

mysql> delimiter ;

3、 创建一个更新触发器,在t1表中修改name字段,在t2表自动修改name。

sql 复制代码
mysql> create table t1(
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> create table t2(
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values ('zhangsan'),('lisi');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t2 values ('zhangsan'),('lisi');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+----------+
| name     |
+----------+
| zhangsan |
| lisi     |
+----------+
2 rows in set (0.00 sec)

mysql> select * from t2;
+----------+
| name     |
+----------+
| zhangsan |
| lisi     |
+----------+
2 rows in set (0.00 sec)

触发器

sql 复制代码
mysql> delimiter $$
mysql> create trigger t1_after_uptate_trigger after update
    -> on t1 for each row
    -> begin 
    -> update t2 set name=new.name where name=old.name;
    -> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

查看结果

sql 复制代码
mysql> update t1 set name='zhangsanfeng' where name='zhangsan';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t2;
+--------------+
| name         |
+--------------+
| zhangsanfeng |
| lisi         |
+--------------+
2 rows in set (0.00 sec)

mysql> select * from t1;
+--------------+
| name         |
+--------------+
| zhangsanfeng |
| lisi         |
+--------------+
2 rows in set (0.00 sec)

更多应用需要看实际需求 。

相关推荐
weixin_511255216 小时前
MySQL升级记录
数据库·mysql
程序猿乐锅7 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
Leo.yuan8 小时前
2026年本地化Data Agent优质厂商盘点:哪些产品更适合企业生产环境
大数据·数据库·人工智能
做运维的阿瑞8 小时前
数据库增删改的安全写法
数据库·sql·mysql
程序边界8 小时前
迁移评估不再拍脑袋,这个数据迁移工具的量化报告把我救了(上)
数据库
阿狗童鞋9 小时前
Redis实战指南
数据库·redis·缓存
frjc9 小时前
数据库选型:如何从众多数据库中选出最理想的那一个
redis·mysql·clickhouse·elasticsearch
lupai10 小时前
维修保养记录精准版 API 对接实战指南
数据库·python
小马哥程序开发10 小时前
[点赞收藏免费领取 · 项目源码]37399民族服饰饰品商城小程序
sql·mysql·flask·源码·课程设计·程序开发·课设
2601_9521963612 小时前
计算机科学与技术专业应届生投商业分析岗,需要哪些额外能力?
数据库·oracle