MySQL如何进行表之间的关联更新
在实际编程工作或运维实践中,对MySQL数据库表进行关联更新是一种比较常见的应用场景,比如在电商系统中,订单表里保存了商品名称的信息(冗余字段设计),但如果商品名称发生变化,则需要通过关联商品id,把新的商品名称更新到订单表中;或者,学生表中保存了班级信息,但关联的班级表发生变化,那么学生表也需要同步更新,等等。
针对这样的业务场景,我们来看看有什么方法可以实现关联更新,当然,这样的知识相对比较基础,资深或者高级专业人士请绕行,以免留下笑柄,但如果你记得不是很清楚,或者还不是很确定,可以尝试往下看看。同时,在面试过程中,也经常会问起这样的问题,以考察候选人的基础知识掌握水平。
一、准备工作
我们首先创建演示用的数据库表,一张是订单表,里面包含了商品id和商品名称,一张是商品表,保存了商品的基本信息,两张表通过商品id进行关联,创建完成后,我们向表中插入一些简单的测试数据。
首先创建两张表:
CREATE TABLE `t_order` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`product_id` int(11) DEFAULT NULL COMMENT '商品id',`product_name` varchar(32) DEFAULT NULL COMMENT '商品名称',`amout` decimal(10,2) DEFAULT NULL COMMENT '订单金额',`order_time` timestamp NULL DEFAULT NULL COMMENT '下单时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `t_product` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`product_name` varchar(32) DEFAULT NULL COMMENT '商品名称',`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
再插入一些简单的测试数据:
INSERT INTO `t_order` VALUES ('1', '1', '科幻图书', '25.00', '2023-08-21 17:16:54');
INSERT INTO `t_order` VALUES ('2', '2', '台灯', '12.00', '2023-08-21 17:17:22');
INSERT INTO `t_order` VALUES ('3', '128', '篮球', '82.00', '2023-08-21 17:18:18');
INSERT INTO `t_product` VALUES ('1', '编程书籍', '2023-08-21 17:15:24');
INSERT INTO `t_product` VALUES ('2', '电饭锅', '2023-08-21 17:15:27');
INSERT INTO `t_product` VALUES ('3', '加薪神器', '2023-08-21 17:16:00');
执行上面的sql后,表中的数据是这样的:
二、通过JOIN进行关联更新
也就是通过INNER JOIN或者LEFT JOIN进行关联更新,当然,使用RIGHT JOIN也可以,只不过关联的主表变成了右边的那张,更多是一个习惯问题。我们先看看INNER JOIN的情况:
UPDATE t_order o
INNER JOIN t_product p ON o.product_id=p.id
SET o.product_name=p.product_name
SQL如上所示,它把订单表中的商品名称字段值更新为商品表中的商品名称,更新后订单表的结果如下:
可以看到,product_id等于1和2的商品名称,已经更新为商品表中的最新结果,之前的商品名称分别为科幻图片和台灯,执行sql后,更新为商品表中对应id的名称,分别为编程书籍和电饭锅。执行信息显示,有两行数据受到了影响。
上面是用INNER JOIN进行更新,如果使用LEFT JOIN(sql不用任何其它修改,只把INNER换成LEFT即可),结果稍有不同:
可以看到,product_id=128的记录,它的商品名称被更新为NULL值了,而且执行信息也显示,有三行数据受到了影响。这主要是因为内联接和左联接的处理逻辑不同,INNER JOIN是强关联,而对LEFT JOIN来说,即使副表没有满足条件的数据,也会处理成NULL,详细区别可参考相关资料。
三、通过子查询进行处理
可以通过子查询的方式进行关联更新:
UPDATE t_order t
SET t.product_name =(SELECT product_name FROM t_product p WHERE t.product_id = p.id)
更新操作也是影响了三行数据,同时,对于product_id=128的数据,它的商品名称更新为NULL值,跟LEFT JOIN的效果一样:
四、直接UPDATE多表
根据UPDATE语法规则,它后面可以直接跟随多个表,表之间使用逗号分隔:
UPDATE t_order o, t_product p
SET o.product_name=p.product_name
WHERE o.product_id=p.id
执行信息提示影响了2行数据,它的效果跟INNER JOIN是一样的,product_id=128的数据没有被更新,还保持原状:
五、结尾
多表关联更新也是非常常见的业务场景,不光是编写代码时会碰到这样的需求,在数据库运维时,也常常会做这样的操作。完成这样的需求,有多种不同的实现手段,我们从上面可以看到,这些方法之间也有些细微的差别:不满足关联条件的数据是否也进行了更新。这个就依需求而定了。
都看到这里了,请帮忙一键三连啊,也就是点击文末的在看、点赞、分享,这样会让我的文章让更多人看到,也会大大地激励我进行更多的输出,谢谢!
推荐阅读:
一网打尽:MySQL索引失效的场景大搜罗
这个设计模式的用法,一般人我不告诉他
《论语》是很多公司取名的源泉
相关文章:
MySQL如何进行表之间的关联更新
在实际编程工作或运维实践中,对MySQL数据库表进行关联更新是一种比较常见的应用场景,比如在电商系统中,订单表里保存了商品名称的信息(冗余字段设计),但如果商品名称发生变化,则需要通过关联商品…...
Docker创建 LNMP 服务+Wordpress 网站平台
Docker创建 LNMP 服务Wordpress 网站平台 一.环境及准备工作 1.项目环境 公司在实际的生产环境中,需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。 容器 系统 IP地址 软件 nginx centos…...
node没有自动安装npm时,如何手动安装 npm
之前写过一篇使用 nvm 管理 node 版本的文章,node版本管理(Windows) 有时候,我们使用 nvm 下载 node 时,node 没有自动下载 npm ,此时就需要我们自己手动下载 npm 1、下载 npm下载地址:&…...
C# 使用递归方法实现汉诺塔步数计算
C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子:计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…...
窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器
上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用,但实际上窗口函数除了可以进行单行计算,还可以在每行上打开一个指定大小的计算窗口,这个计算窗口可以由SQL中的语句具体指定,大到整个…...
健康检测智能睡眠床垫方案
《2022中国睡眠质量调查报告》调查结果显示,16%的被调查者存在夜间睡眠时间不足6个小时,表现为24点以后才上床睡觉,并且在6点之前起床;有83.81%的被调查者经常受到睡眠问题困扰,其中入睡困难占2…...
计网第三章(数据链路层)(五)
目录 一、以太网交换机自学习和转发帧的过程 1.两层交换机和三层交换机 2.以太网交换机的基本原理 3.具体实现过程 一、以太网交换机自学习和转发帧的过程 1.两层交换机和三层交换机 大家可能注意到平常做题时有叫两层交换机,或者三层交换机的。 两层交换机就…...
嵌入式系统中常见内存的划分方法
看到有小伙伴在讨论关于单片机内存的话题,今天就结合STM32给大家描述一下常见的划分区域。 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全…...
深入理解与实现:常见搜索算法的Java示例
深入理解与实现:常见搜索算法的Java示例 搜索算法在计算机科学中扮演着重要角色,用于在数据集中查找特定元素或解决问题。在本篇博客中,我们将深入探讨图算法的一个重要分支:图的搜索算法。具体而言,我们将介绍图的深…...
PHP自己的框架实现操作成功失败跳转(完善篇四)
1、实现效果,操作成功后失败成功自动跳转 2、创建操作成功失败跳转方法CrlBase.php /**成功后跳转*跳转地址$url* 跳转显示信息$msg* 等待时间$wait* 是否自动跳转$jump*/protected function ok($urlNULL,$msg操作成功,$wait3,$jump1){$code1;include KJ_CORE./tp…...
【汇编语言】CS、IP寄存器
文章目录 修改CS、IP的指令转移指令jmp问题分析 修改CS、IP的指令 理论:CPU执行何处的指令,取决于CS:IP应用:程序员可以通过改变CS、IP中的内容,进行控制CPU即将要执行的目标指令;问题:如何改变CS、IP中的…...
Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”
1.问题描述 基于之前的开发程序 Nvidia Jetson 编解码开发(2)Jetpack 4.x版本Multimedia API 硬件编码开发--集成encode模块_free-xx的博客-CSDN博客 通过Jetson Xavier NX 硬编码的H265发出后, 上位机断点播放发出来的H265码流, 会报“PPS id out of range” 错误 …...
Angular中如何获取URL参数?
Angular中的ActivatedRoute中保存着路由信息,可用来提取URL中的路由参数。 constructor(private route: ActivatedRoute){}ngOnInit(): void {this.getUser();}getUser(): void {const id this.route.snapshot.paramMap.get(id);} }route.snapshot是一个路由信息的…...
uniapp编写微信小程序和H5遇到的坑总结
uniapp编写微信小程序和H5遇到的坑总结 1、阻止事件冒泡2、二维码生成3、H5跨域配置4、H5时,地址栏上添加版本号5、H5时,tabBar遮挡部分内容6、uniapp使用webview通信6.1、uniapp编写的小程序嵌入h5之间的通信6.1.1、小程序向h5发送消息6.1.2、h5向小程序…...
课程表-广度优先和图
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如&am…...
机器学习|决策树:数学原理及代码解析
机器学习|决策树:数学原理及代码解析 决策树是一种常用的监督学习算法,适用于解决分类和回归问题。在本文中,我们将深入探讨决策树的数学原理,并提供 Python 示例代码帮助读者更好地理解和实现该算法。 决策树数学原…...
1.0的星火2.0必将燎原——图文声影PPT全测试
一、前言 大家好,勇哥又来分享AI模型了,前几天讯飞发布的星火大模型2.0迅速的进入了我们圈子里,为了有更多更好的模型分享给大家,分享星火大模型2.0是必须做的,我做一个传递着,希望大家也星火相传啊。 我…...
[MySQL]主从服务器布置
配置主服务器 配置文件 /etc/my.cnf 在[mysqld]下进行配置 log_binON //启动二进制日志 log-bin mysql-bin //启用二进制日志,用于记录主服务器的更新操作 server-id 1 // 用来表示mysql服务id,保证集成环境中的唯一性 , 范围 [1,2^32) read-only0 // 1表示只…...
图像处理算法大全(基于libyuv或IPP)----NV12转成I420,RGB24,ARGB集合
《周星星教你学ffmpeg》技巧 libyuv源码: static void NV12ToI420(BYTE* pNV12_Y, BYTE* pNV12_UV, BYTE* pYV12, int width, int height) { libyuv::NV12ToI420(pNV12_Y, width, pNV12_UV, width, pYV12, width, pYV12 height*width, width / 2, pYV12 hei…...
机器人操作系统:ROS2 仿真入门
塞巴斯蒂安 一、说明 在机器人项目中,仿真是一个具有多种用途的重要方面。首先,您可以测试希望机器人执行的行为代码。其次,您可以使用仿真来测试不同类型的硬件,例如距离传感器、相机或 3D 点云传感器,看看哪种效果最…...
面试题:线程池的底层工作原理
线程池的几个重要的参数: 1、corePoolSize:线程池的核心线程数(也是默认线程数) 2、maximumPoolSize:最大线程数 3、keepAliveTime:允许的线程最大空闲时间(单位/秒) 线程池内部是…...
Excel/PowerPoint条形图改变顺序
条形图是从下往上排的,很多时候不是我们想要的效果 解决方案 选择坐标轴,双击,按下图顺序点击 效果...
【操作系统】虚拟内存相关分段分页页面置换算法
虚拟内存是什么? 【进程地址空间虚拟地址空间C/C程序地址空间就是那个4G的空间】 虚拟内存是操作系统内核为了对进程地址空间进行管理,而设计的一个逻辑意义上的内存空间概念。在程序运行过程中,虚拟内存中需要被访问的部分会被映射到物理内…...
Unrecognized Hadoop major version number: 3.0.0-cdh6.3.2
一.环境描述 spark提交job到yarn报错,业务代码比较简单,通过接口调用获取数据,将数据通过sparksql将数据写入hive中,尝试各种替换hadoop版本,最后拿下 1.hadoop环境 2.项目 pom.xml spark-submit \ --name GridCorr…...
机器学习分类,损失函数中为什么要用Log,机器学习的应用
目录 损失函数中为什么要用Log 为什么对数可以将乘法转化为加法? 机器学习(Machine Learning) 机器学习的分类 监督学习 无监督学习 强化学习 机器学习的应用 应用举例:猫狗分类 1. 现实问题抽象为数学问题 2. 数据准备…...
PySpark安装及WordCount实现(基于Ubuntu)
先盘点一下要安装哪些东西: VMwareubuntu 14.04(64位)Java环境(JDK 1.8)Hadoop 2.7.1Spark 2.4.0(Local模式)Pycharm (一)Ubuntu VMware 和 ubuntu 14.04(…...
SpringBoot 模板模式实现优惠券逻辑
一、计算逻辑的类结构图 在这张图里,顶层接口 RuleTemplate 定义了 calculate 方法,抽象模板类 AbstractRuleTemplate 将通用的模板计算逻辑在 calculate 方法中实现,同时它还定义了一个抽象方法 calculateNewPrice 作为子类的扩展点。各个具…...
并查集 rank 的优化(Java 实例代码)
目录 并查集 rank 的优化 Java 实例代码 UnionFind3.java 文件代码: 并查集 rank 的优化 上一小节介绍了并查集基于 size 的优化,但是某些场景下,也会存在某些问题,如下图所示,操作 union(4,2)。 根据上一小节&…...
TDA4超级玩家浮出水面,行泊一体功能、成本刷到极致
2023年以来,智能驾驶市场进入L2普及、高阶ADAS功能(NOA)大规模量产的新周期,降本增效,打造极致性价比、提升用户体验等,成为了竞争的焦点。 其中,替换更具性价比的硬件平台、传感器复用、系统优…...
3分钟了解Android中稳定性测试
一、什么是Monkey Monkey在英文里的含义是猴子,在测试行业的学名叫“猴子测试”,指的是没有测试经验的人甚至是根本不懂计算机的人(就像一只猴子),不需要知道程序的任何用户交互方面的知识,给他一个程序&a…...
wordpress页面父级/seo推广公司招商
代表“Objective-C”的标志,证明您正在使用Objective-C语言 Objective-C语言关键词,property与synthesize配对使用。 功能:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。 如: 1、在头文件中:…...
做图的ppt模板下载网站/百青藤广告联盟
下面是以十六进制格式存储的一个UDP首部: CB84000D001C001C 试问: a.源端口号是什么? b.目的端口号是什么? c.这个用户数据报的总长度是什么? d.数据长度是多少? e.这个分组是从客户…...
贵阳市做网站的公司/网站自助搭建
详解 Vue 目录及配置文件之 node_modules,src,static,test 目录 1.1 项目目录介绍 目录/文件说明 详解 build项目构建(webpack)相关代码详解config配置目录,包括端口号等详解node_modulesnpm 加载的项目依赖模块详解src这里是我们…...
沈阳室内设计公司/seo包年优化平台
一.数据库的特点:a.实现数据共享 b.采用特定的数据类型. c.具有较高的数据独立性 d.具有统一的数据控制功能.二.mysql的优势:a.速度:运行速度快b.价格:mysql对多数个人来说是面费的.c.容易使用:与其他大型数据库的设置和管理相比,其复杂程度较低,易于学习.d.可移植性:能够工作…...
做网站如何防止被抄袭/长尾关键词排名推广
数据分析可以分为广义的数据分析和狭义的数据分析,广义的数据分析就包括狭义的数据分析和数据挖掘,我们常说的数据分析就是指狭义的数据分析。 数据分析(狭义): (1)定义:简单来说&…...
java做网站seo/排名点击软件怎样
因为实际项目中没用用到这个东西,所以我也没深入研究下去,就是简单做下使用而已。如果要深入研究,看这边文章就可以https://www.iteye.com/magazines/132-Java-NIO 案例 客户端 package fei.com.nitty.sendstring.client;import io.netty.b…...