MySQL进行表之间关联更新的实现方法

 更新时间:2023年10月12日 11:35:56   作者:互联网全栈架构  
在实际编程工作或运维实践中,对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后,表中的数据是这样的:

f29b2c584e50c31d85bb63e6f9ec5fe0.png

730b530f8ca2cb1334b25d0309695449.png

二、通过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如上所示,它把订单表中的商品名称字段值更新为商品表中的商品名称,更新后订单表的结果如下:

a3e40a0093ea7dba1a001ba8841e869b.png

可以看到,product_id等于1和2的商品名称,已经更新为商品表中的最新结果,之前的商品名称分别为科幻图片和台灯,执行sql后,更新为商品表中对应id的名称,分别为编程书籍和电饭锅。执行信息显示,有两行数据受到了影响。

上面是用INNER JOIN进行更新,如果使用LEFT JOIN(sql不用任何其它修改,只把INNER换成LEFT即可),结果稍有不同:

4fdf4190a994a84ea5b8ba007e74dfed.png

可以看到,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的效果一样:

32c63902c0a187a0b9bce785ba0dd40f.png

四、直接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的数据没有被更新,还保持原状:

714df2712161f31d38726789f6447079.png

五、结尾

多表关联更新也是非常常见的业务场景,不光是编写代码时会碰到这样的需求,在数据库运维时,也常常会做这样的操作。完成这样的需求,有多种不同的实现手段,我们从上面可以看到,这些方法之间也有些细微的差别:不满足关联条件的数据是否也进行了更新。这个就依需求而定了。

以上就是MySQL进行表之间关联更新的实现方法的详细内容,更多关于MySQL表之间关联更新的资料请关注脚本之家其它相关文章!

相关文章

  • jdbc调用mysql存储过程实现代码

    jdbc调用mysql存储过程实现代码

    接下来将介绍下mysql存储过程的创建及调用,调用时涉及到jdbc的知识,不熟悉的朋友还要温习下jdbc哦,话不多说看代码,希望可以帮助到你
    2013-03-03
  • MySQL数据表修改与管理的完整指南

    MySQL数据表修改与管理的完整指南

    在数据库的日常使用中,我们经常需要对已有的数据表进行调整和优化,无论是修改表结构、删除不再需要的表,还是管理临时数据,本文将全面讲解MySQL数据表的修改、删除和临时表管理,让你轻松应对各种表管理需求,需要的朋友可以参考下
    2026-02-02
  • mysql Load Data InFile 的用法

    mysql Load Data InFile 的用法

    Load Data InFile是用于批量向数据表中导入记录。
    2009-05-05
  • MySQL5.7主从配置实例解析

    MySQL5.7主从配置实例解析

    这篇文章主要为大家详细解析了MySQL5.7主从配置的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 创建mysql表分区的方法

    创建mysql表分区的方法

    我来给大家介绍一下mysql表分区创建与使用吧,希望对各位同学会有所帮助。表分区的测试使用,主要内容来自于其他博客文章以及mysql5.1的参考手册。
    2013-10-10
  • mysql 5.7.17 安装教程 附MySQL服务无法启动的解决方法

    mysql 5.7.17 安装教程 附MySQL服务无法启动的解决方法

    这篇文章主要为大家详细介绍了mysql 5.7.17安装教程,并且为大家分享了MySQL服务无法启动的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 解决MySQL Varchar 类型尾部空格的问题

    解决MySQL Varchar 类型尾部空格的问题

    这篇文章主要介绍了MySQL Varchar 类型尾部空格,在这里需要注意的是 binary 排序规则的 pad 属性为 NO PAD,这里其实不是个例外,因为 char、varchar 和 text 类型都归类为 nonbinary,感兴趣的朋友跟随小编一起学习下吧
    2022-04-04
  • MySQL存粹问题面试准备总结大全

    MySQL存粹问题面试准备总结大全

    这篇文章主要介绍了MySQL存粹问题面试准备总结的相关资料,MySQL面试中常见问题,包括但不限于事务,索引,引擎,场景优化等常见问题,有助于面试前的准备,需要的朋友可以参考下
    2026-05-05
  • Mysql中SUBSTRING函数的具体使用

    Mysql中SUBSTRING函数的具体使用

    本文主要介绍了Mysql中SUBSTRING函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 详解Linux终端 MySQL常用操作指令

    详解Linux终端 MySQL常用操作指令

    这篇文章主要介绍了Linux终端 MySQL常用操作指令的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02

最新评论