深入学习MYSQL-使用触发器

news/2024/10/31 1:33:07/

触发器

每个表最多支持6个触发器,(insert,update,delete)之前和之后。

  • 删除触发器
drop trigger trigger_name;
  • insert 触发器
     在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;
     在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值);
     对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
    下面来看例子(这里书上的例子尽然不可以,不知道是不是版本的原因):
    首先我们创建一个表用于记录日志
CREATE TABLE product_log (log_id INT AUTO_INCREMENT PRIMARY KEY,prod_id VARCHAR(50),action VARCHAR(50),action_date DATETIME
);

创建一个触发器

DELIMITER $$
CREATE TRIGGER newproduct 
AFTER INSERT 
ON products 
FOR EACH ROW 
BEGIN
--这个new 虚拟表可以拿到插入后的值INSERT INTO product_log(prod_id, action, action_date) VALUES (NEW.prod_id, 'product added', NOW());
END;$$
DELIMITER ;

在这里插入图片描述
同时我们是可以在插入之前修改值的

DELIMITER $$
CREATE TRIGGER beforeinsert 
BEFORE INSERT 
ON products 
FOR EACH ROW 
BEGIN
-- 插入之前更新值set NEW.prod_price = 111.0;
END;$$
INSERT INTO `products` VALUES ('ANV10', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');

我们可以看到执行结果,我们插入里面写的是5.99但是最终存储是111.0是因为在插入之前我们更新了这个值
在这里插入图片描述
注:这里还有一点在使用before更新值的时候,我们这个列不能是外键,外键是不能更新成功的。主键可以被更新。

  • update触发器
     在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
     在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
     OLD中的值全都是只读的,不能更新。
    下面我们来看一个例子:
CREATE TABLE test_update(id int not null auto_increment primary key,before_id char(50) not null,after_id char(50) not null
);
DELIMITER $$
CREATE TRIGGER afterupdate 
AFTER UPDATE 
ON products 
FOR EACH ROW 
BEGININSERT INTO test_update(before_id,after_id)values(old.prod_id,new.prod_id);
END;$$

在这里插入图片描述
在update之前我们也可以new中的值,这个用法和insert一样这里哦不在演示。

  • delete触发器
     在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行;
     OLD中的值全都是只读的,不能更新。
    这里直接用了之前的表,只是重新改了个名字测试
DELIMITER $$
CREATE TRIGGER beforedelete 
BEFORE DELETE 
ON products 
FOR EACH ROW 
BEGININSERT INTO test_delete(before_id,after_id)values(old.prod_id,old.prod_id);
END;$$

在这里插入图片描述
这个在删除之前和删除之后都可以通过old虚拟表拿到值。


http://www.ppmy.cn/news/83085.html

相关文章

API测试| 了解API接口测试| API接口测试指南

什么是API? API是一个缩写,它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程,协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序:执行特定任务的程序。例程也称为过…

搭建监控日志系统

在微服务或者集群架构中,一次请求的调用会跨多个服务(web,mysql,feign等)、多个模块(用户模块,商品模块等)、多个容器(用户模块可能有多个实例),这…

Unity之OpenXR+XR Interaction Toolkit 安装和配置

前言 XR Interaction Toolkit 是Unity基于OpenXR标准,发布的一套XR工具,目的是方便我们快速接入XR相关的SDK,并且做到兼容不同VR设备的目的,目前流行的VR设备如Oculus,Metal,HTC Vive,Pico等统统都支持。 所以我们今天的目的就是把XR Interaction Toolkit从导入到配置,…

Elastic Learned Sparse Encoder 简介:Elastic 用于语义搜索的 AI 模型

作者:Aris Papadopoulos, Gilad Gal 寻找意义,而不仅仅是文字 我们很高兴地与大家分享,在 8.8 中,Elastic 提供开箱即用的语义搜索。语义搜索旨在根据文本的意图或含义进行搜索,而不是词汇匹配或关键字查询。与传统的…

C++11 call_once 和 once_flag

文章目录 一、简介二、原理2.1 示例2.2 call_once源码详解2.3 once_flag源码详解 三、Linux内核中的 DO_ONCE 机制 一、简介 std::call_once 和 std::once_flag 是 C11 中引入的线程安全的函数和类型,用于确保某个函数只被调用一次。 std::once_flag 是一个类型&a…

SpringBoot + Docker 实现一次构建到处运行

一、容器化部署的好处 Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行宿主内…

设计模式详解之工厂模式

作者:刘文慧 本文将着眼于工厂模式,从简单工厂模式、工厂方法模式和抽象工厂模式出发,展开学习和深入探讨。 ​ 一、概述 我们在进行软件开发时要想实现可维护、可扩展,就需要尽量复用代码,并且降低代码的耦合度&…

如何使用 VSCode 软件运行C代码

VSCode 的下载和扩展的配置可以参考文章:VSCode 的安装与插件配置。 VSCode 是很好用的编辑器,通过给其配置 MinGW-w64 插件就可以在它上面编译运行C代码了。 在没有配置 MinGW-w64 插件时,在 VSCode 中运行下面的代码后打印如下图所示。 这…