触发器(数据库必学)

article/2025/10/24 21:33:11

文章目录

    • 概念
      • 注意
    • 优缺点
      • 优点
      • 缺点
    • 语法
      • 参数说明
    • 查看触发器
    • 删除触发器
    • 实例
    • 实际应用
      • 注意
      • 重新编辑
      • 拓展
      • 不能对同一张表进行修改

概念

触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的。而存储过程则需要主动调用其名字执行

注意

  1. 在 MySQL 5 中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一,即同一数据库中的两个表可能具有相同名字的触发器
  2. 每个表的每个事件每次只允许一个触发器,因此,每个表最多支持 6 个触发器,before/after insert、before/after delete、before/after update

优缺点

优点

可以保证数据安全,并进行安全校验

缺点

过分依赖触发器,影响数据库的结构,增加数据库的维护成本

语法

delimiter 自定义结束符号 create trigger 触发器名字 触发时间 触发事件 onfor each row begin-- 触发器内容主体,每行用分号结尾 end 自定义的结束符合 delimiter ;

参数说明

1、触发器时间

当 SQL 指令发生时,会令行中数据发生变化,而每张表中对应的行有两种状态:数据操作前和操作后

  • before:表中数据发生改变前的状态
  • after:表中数据发生改变后的状态

2、触发事件

触发器是针对数据发送改变才会被触发,对应的操作只有

  • INSERT
  • DELETE
  • UPDATE

查看触发器

1、查看全部

show triggers;

2、查看单个

show create trigger 触发器名称;

删除触发器

drop trigger 触发器名称;

实例

如果订单表发生数据插入,对应的商品库存应该减少

在这里插入图片描述
在这里插入图片描述

实际应用

上述数据是写死的,并不灵活,因为无论购买多少商品,始终 - 1

触发器针对的是数据库中的每一行记录,每行数据在操作前后都会有一个对应的状态,触发器将没有操作之前的状态保存到 old 关键字中,将操作后的状态保存到 new 中

注意

old 和 new 不是所有触发器都有

在这里插入图片描述

重新编辑

在这里插入图片描述
在这里插入图片描述

此时的new.goods_num是是orders表里面的goods_num,goods_id同理

拓展

当然我们还需要考虑一种情况:如果此时商品的库存不够了,该怎么处理?

解决:在 insert 之前查询库存,若不够就暴力解决

在这里插入图片描述
在这里插入图片描述

在此:如果在触发器中出现错误,那么前面的已经执行的操作也会全部清空

不能对同一张表进行修改

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Hl5r7p5r.shtml

相关文章

C语言实现字符串逆序、倒置字符串(字符串逆序问题的升级)

一.字符串逆序 问题描述&#xff1a; 输入一个字符串str&#xff0c;将其内容颠倒过来&#xff0c;并输出。 数据范围0<len(str)<10000 输入描述&#xff1a; 输入一个字符串&#xff0c;可以有空格 输出描述&#xff1a; 输出逆序的字符串 输入样例&#xff1a; …

指针实现字符串逆序

代码如下&#xff1a; #include<stdio.h> #include<string.h> void reverse(char* str) { //指针变量分别指向第一个和最后一个元素&#xff0c;借助中间变量temp进行交换。char* left str;char* right str strlen(str) - 1;while (left < right){char temp…

c语言字符串逆序输出reverse,将一个字符串逆序输出

C语言:输入一个字符串,然后逆序输出 输入一个字符串,然后逆序输出,要CSS布局HTML小编今天和大家分享主函数调用fun函数,fun的功能是逆可以将整数当做字符串(字符串长度不超过10)接收,然后反向输出字符数组元素即可。 字符串实际长度可以用strlen函数来计算。 方法程序如下…

字符串逆序输出

字符串逆置 方法1:下标法&#xff0c;定义一个i下标从头开始&#xff0c;使用strlen函数求出字符串长度(不包括\0),定义一个j下标等于字符串长度减一&#xff0c;i&#xff0c;j下标字符进行交换&#xff0c;只需要遍历字符串长度一半即可 方法2:额外创建一个数组&#xff0c…

递归实现字符串逆序

编写一个函数 reverse_string(char * string)&#xff08;递归实现&#xff09;&#xff0c;将参数字符串中的字符反向排列&#xff0c;不是逆序打印。 &#xff08;要求&#xff1a;不能使用C函数库中的字符串操作函数。&#xff09; &#xff08;在本次练习中&#xff0c;由于…

C字符串逆序、C++字符串逆序

1.C字符串逆序&#xff1a; void CReverse(char* ch) {int nLen strlen(ch) - 1;char szStr;for (int i 0; i < nLen - i; i){szStr ch[i];ch[i] ch[nLen - i];ch[nLen - i] szStr;}ch[nLen 1] 0; } 2.C字符串逆序&#xff08;利用栈的先进后出的原理&#xff09; …

字符串逆序 - 多种方法实现

字符串逆序实现方法 1. 借助额外数组2. 循环实现2.1 图解2.2 思路2.3 代码实现 3. 递归实现14. 递归实现24.1 思路 对字符串进行逆序&#xff0c;以字符串abcdef为例 1. 借助额外数组 #include <stdio.h> #include <string.h>int main() {char str[] "abcd…

字符串逆序的几种写法

字符串逆序的几种写法 提示&#xff1a;将字符串逆序与将其逆序打印出来是两码事&#xff0c;逆序是将内容倒着改变了&#xff0c;逆序打印虽然打印结果也是倒着的&#xff0c;不过储存字符串的数组内容并没有改变。 一、非递归写法 1. 将一个给定的字符串abcdef逆序 #incl…

字符串逆序(递归实现)

目录 一、代码实现&#xff1a; 二、代码逐步实现过程&#xff1a; 1、不用递归用循环方式实现&#xff1a; 1、使用库函数&#xff1a; 2、不使用库函数&#xff1a; &#xff08;1&#xff09;使用参数是数组的形式&#xff1a; &#xff08;2&#xff09;使用参数是指…

【C语言刷题】字符串逆序

目录 一、字符串逆序&#xff08;基础题&#xff09; 1.一个经典的错误&#xff0c;标准的零分 2.采用gets函数来修补漏洞 3.非要使用scanf怎么办&#xff1f; 4.使用指针来实现逆序函数 5.将函数修改为&#xff0c;只要传入两个地址&#xff0c;就能逆序这两个地址之间的…

使用C语言实现字符串逆序操作

这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下 编写一个函数 reverse_string(char * string) 实现&#xff1a;将参数字符串中的字符反向排列。 要求&#xff1a;不能使用C函数库…

C语言实现——字符串逆序

目录 前言 如何实现 代码实现 1.设立一个数组存放输入的字符串 2.将输入的字符串整体逆序 2.1 计算字符串长度 2.2 使用函数来实现倒置 2.3 实现函数reverse 3.将其中每个单词再进行逆序 3.1 整个语句如何结束循环 3.2 每个单词的结束位置 3.3 内部实现 3.4 判断…

dtb展开成device_node

dtb展开成device_node 文章目录 dtb展开成device_node设备树是如何传递给内核的&#xff1f;设备树相关结构体举例of操作函数与查找节点有关的 OF 函数1、of_find_node_by_name 函数2、of_find_node_by_type 函数3、of_find_compatible_node 函数4、of_find_matching_node_and_…

设备树之DTS与DTB格式

目录 一、设备树 二、DTS格式 2.1 属性 2.2 节点 2.3 引用其他节点 2.4 小总结 三、DTB格式 3.1 结构 3.2 分析 一、设备树 对于点灯字符设备驱动程序可以有三种写法&#xff0c;首先是传统方法&#xff0c;这种方式直接在程序中写死&#xff0c;其次是利用总线设备驱…

Android boot.img dtb.img 编译过程

最近做RK3588案子,修改dts后,导致boot.img过大,编译出错,整体分析下boot.img过大的原因是因为在打包boot.img过程中,dbt.img过大导致,所以整体分析下boot.img编译过程,尤其是dbt.img的生成过程. boot.img生成过程 在Andorid跟目录下执行, source build/envsetup.sh 然后lunch x…

Linux 设备树(二) dtc dts/dtsi dtb的关系

在学习设备树之前&#xff0c;我们先来了解一下跟设备树相关的三个对象&#xff0c;分别是dtc、dts/dtsi、dtb。 dtc:用来编译设备树的工具 dts:设备树描述文件 dtsi:设备树头文件 dtb:编译后的二进制文件 dtc设备树编译工具 dtc是用来编译设备树的工具&#xff0c;就像gcc可以…

dtb如何转换到platform_device

分2步&#xff0c;第一步是首先转换为device_node&#xff0c;第二步device_node转换为platform_device。 第一步 /*** unflatten_device_tree - create tree of device_nodes from flat blob** unflattens the device-tree passed by the firmware, creating the* tree of st…

U-Boot 之一 零基础编译 U-Boot 过程详解、Image 镜像介绍及使用说明、DTB 文件使用说明

最近&#xff0c;工作重心要从裸机开发转移到嵌入式 Linux 系统开发&#xff0c;在之前的博文 Linux 之八 完整嵌入式 Linux 环境、&#xff08;交叉&#xff09;编译工具链、CPU 体系架构、嵌入式系统构建工具 中详细介绍了嵌入式 Linux 环境&#xff0c;接下来就是实际动手学…

dts、dtb的那些事儿

笔者最近在支持新的案子&#xff0c;过于忙碌&#xff0c;好久没更新了&#xff0c;勿怪。 1、设备树大变革故事 2011年3月17日的ARM Linux邮件列表有封邮件“this whole ARM thing is a fucking pain in the ass”引起了轩然大波&#xff0c;原来是我们的Linux之父Linus Torv…

DBT工具简介

What is DBT 在将数据加载到集中式数据仓库之前&#xff0c;必须对其进行清理、保持一致并根据需要进行组合。换句话说&#xff0c;必须转换数据&#xff0c;这就是我们所谓的 ETL&#xff08;提取、转换、加载&#xff09;和 ELT 中的“T”。 这是挖掘数据价值的关键一步。 而…