最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySql兩表關(guān)聯(lián)更新update示例SQL語句(用一個表更新另一個表)

 更新時間:2025年06月27日 10:36:54   作者:我來整一篇  
這篇文章主要介紹了MySql兩表關(guān)聯(lián)更新update示例SQL語句的相關(guān)資料,文中分享了兩種處理方式(保留/清空未匹配數(shù)據(jù)),演示觸發(fā)器記錄更新操作至audit表,并通過示例SQL展示不同場景下更新效果及注意事項,需要的朋友可以參考下

前言

本文介紹了如何通過SQL語句實現(xiàn)兩個表之間的關(guān)聯(lián)更新,具體涉及city表和people表。city表包含城市代碼和名稱,people表包含人員信息及其所在城市的代碼和名稱。需求是根據(jù)city表更新people表中的城市名稱。文章提供了兩種更新方式:一種是在未匹配到關(guān)聯(lián)數(shù)據(jù)時保留原有數(shù)據(jù),另一種是未匹配時清空原有數(shù)據(jù)。此外,還介紹了如何通過觸發(fā)器記錄更新操作,并創(chuàng)建了審計表people_audit來存儲更新前后的數(shù)據(jù)。文章通過示例SQL語句展示了不同情況下的更新效果,并總結(jié)了更新時的注意事項。

兩表關(guān)聯(lián)更新update (用一個表更新另一個表)

表及數(shù)據(jù)

  • 建表及數(shù)據(jù)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黑龍江

需求

根據(jù)city表的code和name,更新people的city_name。

創(chuàng)建觸發(fā)器

為了方便查看更新了那些行數(shù)據(jù),為people表創(chuàng)建觸發(fā)器

先創(chuàng)建記錄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;

創(chuàng)建每一行更新后觸發(fā)器

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;

關(guān)聯(lián)無匹配,保持原數(shù)據(jù)

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

正常情況:city表的code唯一

執(zhí)行上面sql,輸出:

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

數(shù)據(jù)修改了三行,結(jié)論

  • 代碼對應的城市更新,對應錯誤的更正
  • city表中沒有的城市,在people表里保持原數(shù)據(jù),不會被清空

異常情況:city表的code不唯一

插入一個重復code的數(shù)據(jù)

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

恢復people表到初始數(shù)據(jù),再次執(zhí)行上面的更新sql,可以發(fā)現(xiàn)與上面返回值一致。

推論:只取先匹配的一個值替換

關(guān)聯(lián)無匹配,清空原數(shù)據(jù)

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

數(shù)據(jù)修改了5行,結(jié)論

  • 代碼對應的城市更新,對應錯誤的更正
  • city表中沒有的城市,在people表里全被更新為null

異常情況:city表的code不唯一

不會報錯,會選匹配其中一個更新。

結(jié)論

更新時未匹配到關(guān)聯(lián)數(shù)據(jù)

未匹配,保留原有數(shù)據(jù)

UPDATE people p , city c  -- 兩張表
SET p.city_name = c.name   -- 更新值
WHERE p.city_code = c.code -- 條件

未匹配,清空原有數(shù)據(jù)

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` -- 關(guān)聯(lián)取數(shù)據(jù)的表
SET p.city_name = c.`name` --更新表字段

總結(jié) 

到此這篇關(guān)于MySql兩表關(guān)聯(lián)更新update示例SQL語句的文章就介紹到這了,更多相關(guān)MySql兩表關(guān)聯(lián)更新update內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中decimal數(shù)據(jù)類型小數(shù)位填充問題詳解

    mysql中decimal數(shù)據(jù)類型小數(shù)位填充問題詳解

    這篇文章主要介紹了mysql中decimal數(shù)據(jù)類型小數(shù)位填充問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • MySQL慢查詢查找和調(diào)優(yōu)測試

    MySQL慢查詢查找和調(diào)優(yōu)測試

    MySQL慢查詢查找和調(diào)優(yōu)測試,接下來詳細介紹,需要了解的朋友可以參考下
    2013-01-01
  • 解析MySQL數(shù)據(jù)庫性能優(yōu)化的六大技巧

    解析MySQL數(shù)據(jù)庫性能優(yōu)化的六大技巧

    本篇文章是對MySQL數(shù)據(jù)庫性能優(yōu)化的六大技巧進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql中的json查詢過程

    mysql中的json查詢過程

    在MySQL數(shù)據(jù)庫中,進行JSON格式數(shù)據(jù)的查詢時,需要使用特定函數(shù)和路徑表達式來實現(xiàn),本文給大家介紹mysql中的json查詢過程,感興趣的朋友一起看看吧
    2024-09-09
  • 一個mysql死鎖場景實例分析

    一個mysql死鎖場景實例分析

    這篇文章主要給大家實例分析了一個mysql死鎖場景的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • MySQL?緩存機制與架構(gòu)解析(最新推薦)

    MySQL?緩存機制與架構(gòu)解析(最新推薦)

    本文詳細介紹了MySQL的緩存機制和整體架構(gòu),包括一級緩存(InnoDB?Buffer?Pool)和二級緩存(Query?Cache),文章還探討了SQL查詢執(zhí)行全流程,并分析了MySQL?8.0移除查詢緩存的原因,最后,提出了應用層緩存和InnoDB緩沖池優(yōu)化的建議,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • mysql處理海量數(shù)據(jù)時的一些優(yōu)化查詢速度方法

    mysql處理海量數(shù)據(jù)時的一些優(yōu)化查詢速度方法

    最近一段時間由于工作需要,開始關(guān)注針對Mysql數(shù)據(jù)庫的select查詢語句的相關(guān)優(yōu)化方法,需要的朋友可以參考下
    2017-04-04
  • MySQL-8.0.26配置圖文教程

    MySQL-8.0.26配置圖文教程

    最近公司項目更換數(shù)據(jù)庫版本,在此記錄分享一下自己安裝配置MySQL8.0版本的過程吧,本文通過圖文并茂的形式給大家介紹的非常詳細,對MySQL-8.0.26配置教程感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • MySQL 邏輯備份與恢復測試的相關(guān)總結(jié)

    MySQL 邏輯備份與恢復測試的相關(guān)總結(jié)

    數(shù)據(jù)庫邏輯備份就是備份軟件按照我們最初所設計的邏輯關(guān)系,以數(shù)據(jù)庫的邏輯結(jié)構(gòu)對象為單位,將數(shù)據(jù)庫中的數(shù)據(jù)按照預定義的邏輯關(guān)聯(lián)格式一條一條生成相關(guān)的文本文件,以達到備份的目的。本文將具體介紹MySQL 邏輯備份的相關(guān)概念及如何做恢復測試。
    2021-05-05
  • 檢查mysql是否成功啟動的方法(bat+bash)

    檢查mysql是否成功啟動的方法(bat+bash)

    這篇文章主要介紹了檢查mysql是否成功啟動的方法(bat+bash),如果mysql沒有啟動則開啟服務,需要的朋友可以參考下
    2016-06-06

最新評論

安化县| 响水县| 龙井市| 平江县| 合作市| 旬阳县| 武夷山市| 铜鼓县| 城步| 即墨市| 张家川| 盐亭县| 邯郸市| 杭锦旗| 舒城县| 花垣县| 广州市| 安乡县| 丹棱县| 泾源县| 博湖县| 古浪县| 手游| 安国市| 巴彦县| 卢氏县| 乌兰察布市| 城固县| 阿坝县| 渭源县| 赫章县| 东方市| 永州市| 白城市| 北京市| 县级市| 安义县| 余庆县| 平罗县| 灵台县| 静海县|