当前位置: 首页 > news >正文

MYSQL中的触发器TRIGGER

1.概念

触发器是一个特殊的存储过程,当触发器保护的数据发生变更时就会触发。

2.特性


1.触发器与表息息相关,一般我们一个表创建六个触发器。

2.六个触发器其实是三种类六个

insert     类型 

  before | after    insert
update   类型   before | after    update
delete    类型   before | after    delete

   当我们进行这三个操作时,启动触发器。

3.触发器写法

CREATE TRIGGER trigger_name trigger_time trigger_eventON table_nameFOR EACH ROWBEGIN...END; 

4.创建触发器(实例,代码可操作)

创建一个学生表和学生详情表

-- 创建数据库
CREATE DATABASE IF NOT EXISTS Test;-- 使用数据库
USE Test;-- 创建表
CREATE TABLE IF NOT EXISTS student (id INT PRIMARY KEY,name VARCHAR(255),age INT
);
-- info详细表
CREATE TABLE stu_detail (id INT PRIMARY KEY,stu_id INT,name VARCHAR(50),age INT,address VARCHAR(100),phone VARCHAR(20)
);-- 向student表中插入多条记录
INSERT INTO student (id, name, age)
VALUES (1, 'John', 25),(2, 'Jane', 28),(3, 'Mike', 30),(4, 'Sarah', 22);-- 向student表中插入多条记录
INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
VALUES (1, 1, 'John', 25, '123 Main St', '123-456-7890');INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
VALUES (2, 2, 'Jane', 28, '456 Elm St', '987-654-3210');INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
VALUES (3, 3, 'Mike', 30, '789 Oak St', '555-123-4567');INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
VALUES (4, 4, 'Sarah', 22, '789 Oak St', '555-123-4567');

创建BEFORE INSERT触发器

该触发器作用为:插入student表时,先检查id是否存在,假如存在的话就回滚操作,并给出异常提醒,不存在才可以插入

DELIMITER //
CREATE TRIGGER before_insert_Student
BEFORE INSERT ON student
FOR EACH ROW
BEGINDECLARE idExists INT;SET idExists = (SELECT COUNT(*) FROM student WHERE id = NEW.id);IF idExists > 0 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入ID已经存在,不允许插入';END IF;
END//
DELIMITER ;

 测试触发器 

id冲突

 id不冲突

 创建AFTER UPDATE触发器

改触发器功能为:

 after update 触发器,当student数据update时,stu_detail表中对应id的记录也随之变更

-- update 触发器
CREATE TRIGGER after_update_student
AFTER UPDATE ON student
FOR EACH ROW
BEGINUPDATE stu_detailSET name = NEW.name, age = NEW.ageWHERE id = NEW.id;
END;

测试触发器

更改成功

 

查看detail表是否自动变更(可发现成功更改)

 创建 AFTER DELETE触发器

CREATE TRIGGER after_delete_student
AFTER DELETE ON student
FOR EACH ROW
BEGINDELETE FROM stu_detail WHERE id = OLD.id;
END;

最后一个我就不测试了,交给大家去检测一下。

5.名词解释 

BEFORE : 代表的意识是在我们的操作(insert,update,delete) 之前就执行触发器

AFTER : 代表的意识是在我们的操作(insert,update,delete)    之后才执行触发器

NEW: 对于insert来说,是将要或者已经新增的数据条

             对于update来说,是将要或者已经修改的数据条

             delete则没有NEW

OLD:     对于delete来说,是将要或者已经删除的数据条

             对于update来说,是修改前的数据条

             insert则没有OLD

NEW和OLD需要大家想一想就知道是啥意思了。

 

相关文章:

  • JavaWeb[总结]
  • 【UE5】物体沿样条线移动
  • 云计算的发展趋势
  • C#写入Datetime到SQL server
  • CodeWhisperer 使用经验分享
  • npm install导致的OOM解决方案
  • Android Glide加载transform CenterCrop, CircleCrop ShapeableImageView圆形图并描边,Kotlin
  • 如何使用Flask开发RESTful API
  • 计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP-项目实战
  • 关于解决前后端分离开发——跨域问题
  • OpenCV图像纹理
  • 如何解决小程序异步请求问题
  • 01_SHELL编程之变量定义(一)
  • PDF/X、PDF/A、PDF/E:有什么区别,为什么有这么多格式?
  • 7、使用真机调试鸿蒙项目
  • Date型的使用
  • GraphQL学习过程应该是这样的
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript实现分页效果
  • Laravel 菜鸟晋级之路
  • Promise面试题2实现异步串行执行
  • SpringBoot几种定时任务的实现方式
  • Vue2 SSR 的优化之旅
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 电商搜索引擎的架构设计和性能优化
  • 前嗅ForeSpider采集配置界面介绍
  • 使用 Docker 部署 Spring Boot项目
  • 使用Swoole加速Laravel(正式环境中)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 为什么要用IPython/Jupyter?
  • 我这样减少了26.5M Java内存!
  • 一天一个设计模式之JS实现——适配器模式
  • 异步
  • 用Python写一份独特的元宵节祝福
  • #大学#套接字
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Java数据结构)ArrayList
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (八十八)VFL语言初步 - 实现布局
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (四)Controller接口控制器详解(三)
  • (转)ABI是什么
  • (转)Scala的“=”符号简介
  • (转)关于多人操作数据的处理策略
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .cfg\.dat\.mak(持续补充)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET MVC之AOP
  • .net refrector
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景