MySQL【触发器、存储过程、函数、范式】
day53
MySQL
触发器
创建触发器:(before : 前置触发器、after :后置触发器)
语法:
delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin多条执行语句end 加上 “结束符xx”delimiter ;还原分隔符未;
注意:
由某个事件去触发某个操作,这些事件有:insert、update、delete语句;
new.字段:当前写法可以获得添加语句字段对应的值
old.字段:当前写法可以获得删除语句字段对应的值
在MySQL中,DELIMITER是用来指定SQL语句中的语句分隔符的关键字。
默认情况下,分号(;)作为语句的结束符号。
当在一个语句中包含了多个语句,比如在创建存储过程、触发器等时,如果直接使用分号作为结束符号,会导致MySQL将整个语句作为一个语句进行解析,从而导致语法错误。所以才有指定分隔符,又还原这个操作。
补充解释:
数据添加后相应的表数据更新的需求,每次用更新语句十分不便
ps:update class set sum = sum+1 where id =1;
所以使用触发器
begin end类似于{},有点像函数,多个语句时使用,单个可不用
对于前触发器,例如删除操作,要在删除之前才拿得到,如果删除之后再操作不行,因为数据已经被删了
在第一次操作之后,再进行重复操作不会再触发触发器
# 触发器# 创建场景 ----------------------------------------------------------------------------# 创建学科表,并添加数据
CREATE TABLE course(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO course(name) VALUES('JavaEE');
INSERT INTO course(name) VALUES('Python');
INSERT INTO course(name) VALUES('HTML');# 创建班级表,并添加数据
CREATE TABLE class(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO class(name) VALUES('01JavaEE');
INSERT INTO class(name) VALUES('02JavaEE');
INSERT INTO class(name) VALUES('01Python');
INSERT INTO class(name) VALUES('02Python');
INSERT INTO class(name) VALUES('01HTML');
INSERT INTO class(name) VALUES('02HTML');# 创建学生表
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),class_id INT(3),course_id INT(3)
)# ------------------------------------------------------------------------------------------------------# 需求:添加学生,并更新班级表和学科表的数据# 创建触发器(添加学生数据之后,就会触发班级表和学科表更新数据的操作)
# delimiter xx - 设置SQL命令的结束符
# trigger - 触发器
# after - 后置触发
delimiter xx
create trigger tri01 after insert on student for each rowBEGINUPDATE class SET sum=sum+1 WHERE id=new.class_id;UPDATE course SET sum=sum+1 WHERE id=new.course_id;END xx
delimiter ;INSERT INTO student(name,class_id,course_id) VALUES('小王',1,1);
INSERT INTO student(name,class_id,course_id) VALUES('小马',1,1);
INSERT INTO student(name,class_id,course_id) VALUES('小李',2,1);
INSERT INTO student(name,class_id,course_id) VALUES('麻生希',3,2);
INSERT INTO student(name,class_id,course_id) VALUES('椎名空',4,2);# ------------------------------------------------------------------------------------------------------# 需求:删除学生,并更新班级表和学科表的数据# 创建触发器(删除学生数据之前,就会触发班级表和学科表更新数据的操作)
delimiter xx
create trigger tri02 before delete on student for each rowBEGINUPDATE class SET sum=sum-1 WHERE id=old.class_id;UPDATE course SET sum=sum-1 WHERE id=old.course_id;END xx
delimiter ;DELETE FROM student WHERE id = 2;# ------------------------------------------------------------------------------------------------------# 删除触发器
DROP TRIGGER tri01;
DROP TRIGGER tri02;
运行分析:
存储过程
理解:类似java里面的方法,但无返回值,有返回参数
参数列表输入类型的参数 -- in输出类型的参数 -- out输入输出类型的参数 -- inout
注意:
对于传入的参数,要与本身参数区分,识别不了会报错
返回参数,需要用到传出参数,into传出参数
调用存储过程,有两种
- 一种直接调用查就会直接打印结果
- 另一种,拿到参数变量值,不会立即打印结果,还可以进行再查操作
对于传入参数与传出参数类型相同,可用传入传出参数,相当于简写
# 存储过程
# 注意:类似于Java里的方法# 创建场景 ----------------------------------------------------------------------------# 创建学生表,并添加数据
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sex VARCHAR(32),age INT(3),salary FLOAT(8,2),course VARCHAR(32)
)
INSERT INTO student(name,sex,age,salary,course) VALUES('奇男子','男',23,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('小兰','男',20,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('奇女子','女',19,17000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('刘德华','男',21,15000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('马德华','男',27,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('霍建华','男',19,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('华晨宇','男',32,5000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('黄日华','男',45,4000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('任达华','男',28,7000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('周华健','男',30,8000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('欧阳震华','男',23,12000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('麻生希','女',30,7000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('椎名空','女',23,6000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('水野朝阳','女',28,8000,'HTML');# ----------------------------------------------------------------------------# 最简单的存储过程
# 查询学生表和用户表里的数据
delimiter xx
CREATE PROCEDURE pro01()BEGINSELECT * FROM student;SELECT * FROM user;END xx
delimiter ;# 调用存储过程
CALL pro01();# ----------------------------------------------------------------------------# SQL中存储过程 与 Java中方法 的区别
# Java方法中的参数指的是外界传入到方法内部的数据,返回值指定是方法结束后返回的具体数据
# SQL存储过程中没有返回值,但是有返回参数# 存储过程中参数的分类:
# in - 传入参数
# out - 传出参数
# inout - 传入传出参数# ----------------------------------------------------------------------------# 需求:创建存储过程,传入学生id,查询出学生姓名
delimiter xx
CREATE PROCEDURE pro02(IN s_id INT(3))BEGINSELECT name FROM student WHERE id=s_id;END xx
delimiter ;# 调用存储过程
CALL pro02(2);# ----------------------------------------------------------------------------# 需求:创建存储过程,传入学生id,返回学生姓名
delimiter xx
CREATE PROCEDURE pro03(IN s_id INT(3),OUT s_name VARCHAR(32))BEGINSELECT name INTO s_name FROM student WHERE id=s_id;END xx
delimiter ;# 调用存储过程
CALL pro03(3,@s_name);
SELECT @s_name;# ----------------------------------------------------------------------------# 需求:创建存储过程,传入学生id,返回学生年龄
delimiter xx
CREATE PROCEDURE pro04(INOUT param INT(3))BEGINSELECT age INTO param FROM student WHERE id=param;END xx
delimiter ;# 调用存储过程
SET @param = 3;
CALL pro04(@param);
SELECT @param;# ----------------------------------------------------------------------------# 删除存储过程
DROP PROCEDURE pro01;
DROP PROCEDURE pro02;
DROP PROCEDURE pro03;
DROP PROCEDURE pro04;
运行分析:
调用存储过程方式1
调用存储过程方式2
函数
预定义函数
数学函数:
绝对值函数:select abs(字段) from 表 ps:此函数指的是求绝对值
平方根函数:select sqrt(9) ps:得到的值为3
求余函数:select mod(10,3) / select 10%3 ps:得到的值为1
随机函数:select rand() ps:得到的值为0~1
幂运算函数:select pow(10,2) ps:10的2次方
字符串函数:
长度函数:select length(‘内容’)
合并函数:select concat(’hello’,’world’)
截取字符串函数:select substring(字段,start,end)
日期/时间函数:
当前日期函数:curdate()
当前时间函数:curtime()
当前日期+时间函数:now()
年函数:year(now())
月函数:month(now())
日函数:dayofmonth(now())
时函数:hour(now())
分函数:minute(now())
秒函数:second(now())
时间格式函数:年月日时分秒‘别名
注意:
当然对于在Navbbicat的 函数里可以看到是否删除
# 预定义函数
# 理解:MySQL给我们提供的函数
# 注意:函数必须有返回值# 数学类函数 -----------------------------------------------------
SELECT ABS(-100);# 求绝对值
SELECT sqrt(9); # 求平方根
SELECT mod(10,3);# 求余数
SELECT pow(2,3); # 求次方
SELECT rand();# 求随机值# 字符串类函数 -----------------------------------------------------SELECT CONCAT("用良心做教育","做真实的自己");# 拼接字符串
SELECT SUBSTR("用良心做教育",2,2);# 截取字符串(目标字符串,第几个字符,截取长度)
SELECT length("用良心做教育");# 获取长度(字节)# 日期时间类函数 -----------------------------------------------------SELECT now();# 获取当前日期时间
SELECT YEAR(NOW());# 获取年
SELECT MONTH(NOW());# 获取月
SELECT DAYOFMONTH(NOW());# 获取日
SELECT HOUR(NOW());# 获取时
SELECT MINUTE(NOW());# 获取分
SELECT SECOND(NOW());# 获取秒
SELECT DATE_FORMAT(NOW(),"%Y年%m月%d日 %H时%i分%s秒");
运行分析:
自定义函数
返回值,需要一个变量去接查到的数据,再返回此变量
对于5.7版本,5.5版本之类不加关键字就可运行,8.0必须加不然运行即报错
加了关键字DETERMINISTIC就认为它是一个函数
语法:
create function 函数名([参数列表]) returns 数据类型 DETERMINISTIC
beginsql语句;return 值;
end
# 自定义函数
# 注意:MySQL的函数必须有返回值# 需求:创建一个函数,传入学生id,返回学生信息delimiter xx
CREATE FUNCTION fun(s_id INT(3)) RETURNS VARCHAR(32) DETERMINISTICBEGINDECLARE s_name VARCHAR(32);SELECT name INTO s_name FROM student WHERE id=s_id;RETURN s_name;END xx
delimiter ;# 调用函数SELECT fun(3);# 删除函数:
DROP function fun;
运行分析:
范式
第一范式:理解为所有数据集中在一张表,存在多种问题
第二范式:简单分表,解决数据冗余,但一对多种关系出现多个数据不可避免
第三范式:再细化分表,第一范式存在问题全部解决;但表就会很多,需要多表联合查询,效率很低
反范式:就是把第三范式细化的多张表,又重新融合一些表,就会出现数据冗余,这里就考验程序员的能力考虑融合
空间换时间:对于现在的空间大可不考虑就得考虑时间
对于第三范式和反范式之间选择:根据具体项目而定,哪些该融合,哪些该细分;就简单说用的少的表可以融合到其他表
下面以表的形式理解
第一范式
第二范式
第三范式
反范式
小结:
- 触发器
- 存储过程
- 函数
- 范式
相关文章:

MySQL【触发器、存储过程、函数、范式】
day53 MySQL 触发器 创建触发器:(before : 前置触发器、after :后置触发器) 语法: delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin…...

Shopee API接口——获取商家店铺商品列表
一、引言 在跨境电商领域,Shopee作为东南亚地区领先的电商平台,为众多商家提供了广阔的市场和丰富的销售机会。本文将详细介绍如何通过Shopee API获取商家店铺商品列表,并探讨其应用场景。 二、核心功能介绍 Shopee API获取商家店铺商品列…...

linux基础知识14
认知权限信息 通过ls -l可以以列表形式查看内容,并显示权限细节r代表读权限,针对文件可以查看文件内容,针对文件夹,可以查看文件夹内容,如ls命令w代表写权限,针对文件表示可以修改此文件,针对文…...
Qt开发入门与环境搭建(基础篇)
文章目录 Qt开发入门与环境搭建(基础篇)1.1 Qt是什么?1.2 Qt版本介绍1.3 Qt开发环境安装1.4 开发第一个QT程序1.5 调试输出1.6 QT Creator常用的快捷键1.7 QT帮助文档1.8 UI设计师使用1.9 按钮控件组1.10 布局控件组1.11 基本布局控件1.12 UI设计师的布局功能Qt开发入门与环…...
CentOS7环境Maxwell的安装及使用
目录 Maxwell的安装 下载安装包 解压安装包 配置环境变量 启用MySQL Binlog 创建Maxwell所需数据库和用户 配置Maxwell Maxwell的使用 启动Kafka集群 Maxwell启停 Maxwell启停脚本 MySQL数据准备 Kafka开启消费者 全量数据同步 增量数据同步 启动Kafka消费者 …...
python环境变量
目录 python环境变量 python-opencv cuda cudnn pytorch pycharm 激活ok了 pyqt5 labelimg notepad gpu-z python 3.6或3.7 标注,文件路径不能有 python环境变量 import os import syscurrent_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(…...

用进程和线程完成TCP进行通信操作及广播和组播的通信
进程 代码 #include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#includ…...

浅谈Tomcat
文章目录 一、什么是Tomcat?二、Tomcat的下载安装三、使用tomcat访问资源 一、什么是Tomcat? Tomcat 就是一个 HTTP 服务器。 前面我们聊了HTTP服务器,像我们在网页输入URL,其实就是在给人家的HTTP服务器发送请求,既…...

C++精解【7】
文章目录 eigen矩阵初始化多维矩阵矩阵和向量size固定大小or 动态大小Matrix类六个模板参数初始化向量元素类型 参考文献 eigen 矩阵初始化 多维矩阵 数组 MatrixXi a { // construct a 2x2 matrix{1, 2}, // first row{3, 4} // second row }; Matrix<do…...

堆箱子00
题目链接 堆箱子 题目描述 注意点 将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子 解答思路 初始想到深度优先遍历,最后超时了参照题解使用动态规划,先将盒子从小到大进行排序,dp[i]存储的是到第i个箱子时堆箱…...

Linux 命令:iftop
1. 写在前面 本文主要介绍 Linux iftop(Interface TOP) 命令:iftop 是一款小巧、免费且功能强大的网卡实时流量监控工具。监控指定网卡的实时流量、端口连接信息、反向解析 IP 等,还可以精确显示本机网络流量及网络内各主机和本机…...

web学习笔记(六十九)vue2
目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 (1)在cmd窗口输入npm install -g vue/cli命令行,快速搭建脚手架。 (2) 创建vue2项目 (3) 选择配置项目,…...
JavaScript全解:从基础到高级,掌握每一个知识点
引言: JavaScript是一种广泛使用的脚本语言,主要用于Web浏览器,但近年来也扩展到了服务器端(Node.js)和其他领域。它允许开发者创建交互式的网页,处理数据,控制用户界面,甚至构建完…...

RabbitMQ的Direct交换机
Direct交换机 BindingKey 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下: 队列与交换机的绑定&a…...
2024.6.26 待学习知识点
OOALV https://www.cnblogs.com/BruceKing/p/11447499.html " 取工单的组件 lt_aufnr CORRESPONDING #( lt_out MAPPING aufnr aufnr EXCEPT * ). ABAP POPUP_TO_CONFIRM 弹出框函数 CLASS-EVENTS CLASS-METHODS main. CLASS-METHODS raise_event_EXIT_COMMAND IMPOR…...
【LeetCode】每日一题:相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&am…...

6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类
基于残差卷积网络和多层感知器变压器编码器(MLP)的优势,提出了一种新型的混合深度学习乳腺病变计算机辅助诊断(CAD)系统。利用骨干残差深度学习网络创建深度特征,利用Transformer根据自注意力机制对乳腺癌进行分类。所提出的CAD系统具有识别两种情况乳腺…...

[leetcode]avoid-flood-in-the-city 避免洪水泛滥
. - 力扣(LeetCode) class Solution { public:vector<int> avoidFlood(vector<int>& rains) {vector<int> ans(rains.size(), 1);set<int> st;unordered_map<int, int> mp;for (int i 0; i < rains.size(); i) {i…...

Pytorch基础
文章目录 零、tensorboard0.1基本使用案例 一、数据结构:Tensor1.1数据类型1.2Tensor的创建方式1.3张量的基本运算1.4张量的属性 二、数据集加载器DataLoaders2.0前置知识2.0.1torch.scatter()、torch.scatter_() 2.1官方案例2.1.1从TorchVision加载数据集2.1.2迭代…...
嵌入技术Embedding
嵌入(Embedding)是一种将高维数据映射到低维空间的技术,广泛应用于自然语言处理(NLP)、计算机视觉和推荐系统等领域。嵌入技术的核心思想是将复杂的数据表示为低维向量,使其在这个低维空间中保留尽可能多的…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...

若依项目部署--传统架构--未完待续
若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…...