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)

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

相关推荐
零炻大礼包24 分钟前
【SQL server】数据库远程连接配置
数据库
zmgst33 分钟前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
令狐少侠201133 分钟前
explain执行计划分析 ref_
mysql
随心............34 分钟前
python操作MySQL以及SQL综合案例
数据库·mysql
€☞扫地僧☜€35 分钟前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
CopyDragon40 分钟前
设置域名跨越访问
数据库·sqlite
xjjeffery41 分钟前
MySQL 基础
数据库·mysql
写bug的小屁孩44 分钟前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
恒辉信达1 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
齐 飞2 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb