MySql两表关联更新update示例SQL语句(用一个表更新另一个表)

 更新时间:2025年06月27日 10:36:54   作者:我来整一篇  
这篇文章主要介绍了MySql两表关联更新update示例SQL语句的相关资料,文中分享了两种处理方式(保留/清空未匹配数据),演示触发器记录更新操作至audit表,并通过示例SQL展示不同场景下更新效果及注意事项,需要的朋友可以参考下

前言

本文介绍了如何通过SQL语句实现两个表之间的关联更新,具体涉及city表和people表。city表包含城市代码和名称,people表包含人员信息及其所在城市的代码和名称。需求是根据city表更新people表中的城市名称。文章提供了两种更新方式:一种是在未匹配到关联数据时保留原有数据,另一种是未匹配时清空原有数据。此外,还介绍了如何通过触发器记录更新操作,并创建了审计表people_audit来存储更新前后的数据。文章通过示例SQL语句展示了不同情况下的更新效果,并总结了更新时的注意事项。

两表关联更新update (用一个表更新另一个表)

表及数据

  • 建表及数据SQL

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for city
    -- ----------------------------
    DROP TABLE IF EXISTS `city`;
    CREATE TABLE `city`  (
      `code` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of city
    -- ----------------------------
    INSERT INTO `city` VALUES ('001', '北京');
    INSERT INTO `city` VALUES ('002', '上海');
    INSERT INTO `city` VALUES ('003', '深圳');
    INSERT INTO `city` VALUES ('004', '南京');
    INSERT INTO `city` VALUES ('005', '广州');
    INSERT INTO `city` VALUES ('006', '成都');
    INSERT INTO `city` VALUES ('007', '重庆');
    
    SET FOREIGN_KEY_CHECKS = 1;
     
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for people
    -- ----------------------------
    DROP TABLE IF EXISTS `people`;
    CREATE TABLE `people`  (
      `pp_id` int NULL DEFAULT NULL,
      `pp_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `city_code` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `city_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of people
    -- ----------------------------
    INSERT INTO `people` VALUES (1, 'john', '001', '北京');
    INSERT INTO `people` VALUES (2, 'timo', '002', '');
    INSERT INTO `people` VALUES (3, '张三', '003', '合肥');
    INSERT INTO `people` VALUES (4, '李四', '008', '');
    INSERT INTO `people` VALUES (5, '王二麻', '009', '黑龙江');
    
    SET FOREIGN_KEY_CHECKS = 1;
    

city表

codename
1北京
2上海
3深圳
4南京
5广州
6成都
7重庆

people表

pp_idpp_namecity_codecity_name
1john1北京
2timo2
3张三3合肥
4李四8
5王二麻9黑龙江

需求

根据city表的code和name,更新people的city_name。

创建触发器

为了方便查看更新了那些行数据,为people表创建触发器

先创建记录people更新记录的审计表

CREATE TABLE `people_audit` (
  `id` int DEFAULT NULL,
  `old_value` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `new_value` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

创建每一行更新后触发器

CREATE TRIGGER before_update_people
BEFORE UPDATE ON people
FOR EACH ROW
BEGIN
  INSERT INTO people_audit(id, old_value, new_value, updated_at)
  VALUES(OLD.pp_id, OLD.city_name, NEW.city_name, NOW());
END;

关联无匹配,保持原数据

UPDATE people p , city c
SET p.city_name = c.name 
WHERE p.city_code = c.code 

正常情况:city表的code唯一

执行上面sql,输出:

idold_valuenew_valueupdated_at
1北京北京2024-5-13 10:19
2上海2024-5-13 10:19
3合肥深圳2024-5-13 10:19

数据修改了三行,结论

  • 代码对应的城市更新,对应错误的更正
  • city表中没有的城市,在people表里保持原数据,不会被清空

异常情况:city表的code不唯一

插入一个重复code的数据

insert into city values('003','合肥');

恢复people表到初始数据,再次执行上面的更新sql,可以发现与上面返回值一致。

推论:只取先匹配的一个值替换

关联无匹配,清空原数据

update people 
set city_name = (
                select min(name) -- 重复时匹配其中一个
                from city
                where code = people.city_code)

或者

UPDATE people p 
LEFT JOIN city c ON p.city_code=c.`code`
SET p.city_name = c.`name`

正常情况:city表的code唯一

idold_valuenew_valueupdated_at
1北京北京2024-5-13 10:26
2上海2024-5-13 10:26
3合肥深圳2024-5-13 10:26
42024-5-13 10:26
5黑龙江2024-5-13 10:26

数据修改了5行,结论

  • 代码对应的城市更新,对应错误的更正
  • city表中没有的城市,在people表里全被更新为null

异常情况:city表的code不唯一

不会报错,会选匹配其中一个更新。

结论

更新时未匹配到关联数据

未匹配,保留原有数据

UPDATE people p , city c  -- 两张表
SET p.city_name = c.name   -- 更新值
WHERE p.city_code = c.code -- 条件

未匹配,清空原有数据

update people 
set city_name = (
                select min(name) -- 重复时匹配其中一个
                from city
                where code = people.city_code)  

或者

UPDATE people p -- 要更新的表
LEFT JOIN city c ON p.city_code=c.`code` -- 关联取数据的表
SET p.city_name = c.`name` --更新表字段

总结 

到此这篇关于MySql两表关联更新update示例SQL语句的文章就介绍到这了,更多相关MySql两表关联更新update内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql中decimal数据类型小数位填充问题详解

    mysql中decimal数据类型小数位填充问题详解

    这篇文章主要介绍了mysql中decimal数据类型小数位填充问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL慢查询查找和调优测试

    MySQL慢查询查找和调优测试

    MySQL慢查询查找和调优测试,接下来详细介绍,需要了解的朋友可以参考下
    2013-01-01
  • 解析MySQL数据库性能优化的六大技巧

    解析MySQL数据库性能优化的六大技巧

    本篇文章是对MySQL数据库性能优化的六大技巧进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql中的json查询过程

    mysql中的json查询过程

    在MySQL数据库中,进行JSON格式数据的查询时,需要使用特定函数和路径表达式来实现,本文给大家介绍mysql中的json查询过程,感兴趣的朋友一起看看吧
    2024-09-09
  • 一个mysql死锁场景实例分析

    一个mysql死锁场景实例分析

    这篇文章主要给大家实例分析了一个mysql死锁场景的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • MySQL 缓存机制与架构解析(最新推荐)

    MySQL 缓存机制与架构解析(最新推荐)

    本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDB Buffer Pool)和二级缓存(Query Cache),文章还探讨了SQL查询执行全流程,并分析了MySQL 8.0移除查询缓存的原因,最后,提出了应用层缓存和InnoDB缓冲池优化的建议,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • mysql处理海量数据时的一些优化查询速度方法

    mysql处理海量数据时的一些优化查询速度方法

    最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法,需要的朋友可以参考下
    2017-04-04
  • MySQL-8.0.26配置图文教程

    MySQL-8.0.26配置图文教程

    最近公司项目更换数据库版本,在此记录分享一下自己安装配置MySQL8.0版本的过程吧,本文通过图文并茂的形式给大家介绍的非常详细,对MySQL-8.0.26配置教程感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • MySQL 逻辑备份与恢复测试的相关总结

    MySQL 逻辑备份与恢复测试的相关总结

    数据库逻辑备份就是备份软件按照我们最初所设计的逻辑关系,以数据库的逻辑结构对象为单位,将数据库中的数据按照预定义的逻辑关联格式一条一条生成相关的文本文件,以达到备份的目的。本文将具体介绍MySQL 逻辑备份的相关概念及如何做恢复测试。
    2021-05-05
  • 检查mysql是否成功启动的方法(bat+bash)

    检查mysql是否成功启动的方法(bat+bash)

    这篇文章主要介绍了检查mysql是否成功启动的方法(bat+bash),如果mysql没有启动则开启服务,需要的朋友可以参考下
    2016-06-06

最新评论