MySQL如何进行表之间的关联更新

这篇具有很好参考价值的文章主要介绍了MySQL如何进行表之间的关联更新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mysql update关联表更新,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后,表中的数据是这样的:

mysql update关联表更新,mysql,数据库

mysql update关联表更新,mysql,数据库

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

mysql update关联表更新,mysql,数据库

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

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

mysql update关联表更新,mysql,数据库

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

mysql update关联表更新,mysql,数据库

四、直接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 update关联表更新,mysql,数据库

五、结尾

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

都看到这里了,请帮忙一键三连啊,也就是点击文末的在看、点赞、分享,这样会让我的文章让更多人看到,也会大大地激励我进行更多的输出,谢谢!

推荐阅读:

高频面试题:多线程顺序打印ABC字符20次

一网打尽:MySQL索引失效的场景大搜罗

这个设计模式的用法,一般人我不告诉他

《论语》是很多公司取名的源泉文章来源地址https://www.toymoban.com/news/detail-765987.html

到了这里,关于MySQL如何进行表之间的关联更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【mybatis】 mybatis在mysql 更新update 操作 更新时间字段按照年月日时分秒格式 更新为当前时间...

    【mybatis】 mybatis在mysql 更新update 操作 更新时间字段按照年月日时分秒格式 更新为当前时间…

    2024年02月10日
    浏览(31)
  • python在Django中,如何使用MySQL数据库进行分页怎么实现

    在Django中,使用MySQL数据库进行分页是一个相对简单的任务。Django的ORM提供了内置的分页功能,你只需要使用Paginator类即可。以下是一个基本的示例,展示了如何在Django中使用MySQL进行分页: 首先,确保你已经安装了Django和MySQL,并且已经配置了Django项目以使用MySQL数据库。

    2024年04月29日
    浏览(35)
  • 阿里云日志服务Logstore与MySQL数据库关联

    已采集日志到日志服务。更多信息,请参见数据采集。 已为日志字段创建索引。更多信息,请参见创建索引。 已有可用的MySQL数据库。更多信息,请参见创建数据库和账号。 1、在MySQL数据库中,创建用户属性表(即 chiji_user 表)。 2、添加白名单。如果是rds,设置ip白名单;

    2024年02月10日
    浏览(28)
  • mysql的两张表left join 进行关联后,索引进行优化案例

    1.表1没加索引  2.表2没加索引 3.查看索引 1.表1添加索引   2.表2添加索引   3.查看  

    2024年02月12日
    浏览(36)
  • 【lesson13】MySQL表的基本操作之create(创建),update(更新)和replace(替换)

    CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 建表 基础测试 全列插入 指定列插入 注意: 1.指定列插入时一定要按前面指定列的顺序,插入数据,否则就会报错。 2.如果忽略某些列,那么这些列一定要有,默认值或者是自增长的,否则就会报错 3.into 也可以省略

    2024年02月04日
    浏览(44)
  • Mysql不同数据库之间表结构同步

    开发环境的Mysql表结构做了修改,要同步到其他环境数据库中使用数据库管理工具JookDB的表结构同步功能就很方便。虽然Navicat也有这个功能但是有免费的当然是用免费的。 用JookDB添加数据库后在数据库节点上右键选择“同步结构”即可开始表结构同步。 1.选择结构同步的源库

    2024年02月05日
    浏览(39)
  • MybatisPlus 使用 saveOrUpdate 详解(慎用),及问题解决方法&mysql保存或更新 ON DUPLICATE KEY UPDATE

    今天的想法是,要在插入数据库时,如果有某某一个主要字段的值重复,则不插入,否则则插入! 看了一下mybatis-Plus是有这个saveOrUpdate 方法! 原本使用save时是没有问题了,改成saveOrUpdate 用了一下就报错了。 com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: error: can not execut

    2024年02月11日
    浏览(23)
  • 华纳云:MySQL中如何书写update避免表锁

    要在 MySQL 中编写 UPDATE 语句以避免表锁定,您可以考虑以下几个方面: 1.使用合适的索引: 确保您的表上存在适当的索引,这将有助于提高 UPDATE 查询的性能并减少锁定时间。通过为 WHERE 条件列创建索引,MySQL 可以更快地定位要更新的行,而不需要锁定整个表。 2.减少影响的

    2024年02月16日
    浏览(31)
  • 如何在 mysql 中实现 update与select结合使用?

    1.只修改一个列的写法: 2.修改多个列的写法: 参考: https://blog.csdn.net/weixin_44671994/article/details/87720196

    2024年02月15日
    浏览(35)
  • SQLite、MySQL、PostgreSQL3个关系数据库之间的对比

    关系数据模型 以行和列的表格形式组织数据,在数据库管理工具中占主导地位。今天还有其他数据模型,包括NoSQL和NewSQL,但是关系数据库管理系统(RDBMS)仍然占主导地位用于存储和管理全球数据。 本文比较了三种实现最广泛的开源RDBMS:SQLite、MySQL和PostgreSQL。具体来说,

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包