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

MySQL進(jìn)行表之間關(guān)聯(lián)更新的實(shí)現(xiàn)方法

 更新時(shí)間:2023年10月12日 11:35:56   作者:互聯(lián)網(wǎng)全棧架構(gòu)  
在實(shí)際編程工作或運(yùn)維實(shí)踐中,對(duì)MySQL數(shù)據(jù)庫(kù)表進(jìn)行關(guān)聯(lián)更新是一種比較常見(jiàn)的應(yīng)用場(chǎng)景,針對(duì)這樣的業(yè)務(wù)場(chǎng)景,我們來(lái)看看有什么方法可以實(shí)現(xiàn)關(guān)聯(lián)更新,需要的朋友可以參考下

在實(shí)際編程工作或運(yùn)維實(shí)踐中,對(duì)MySQL數(shù)據(jù)庫(kù)表進(jìn)行關(guān)聯(lián)更新是一種比較常見(jiàn)的應(yīng)用場(chǎng)景,比如在電商系統(tǒng)中,訂單表里保存了商品名稱(chēng)的信息(冗余字段設(shè)計(jì)),但如果商品名稱(chēng)發(fā)生變化,則需要通過(guò)關(guān)聯(lián)商品id,把新的商品名稱(chēng)更新到訂單表中;或者,學(xué)生表中保存了班級(jí)信息,但關(guān)聯(lián)的班級(jí)表發(fā)生變化,那么學(xué)生表也需要同步更新,等等。

針對(duì)這樣的業(yè)務(wù)場(chǎng)景,我們來(lái)看看有什么方法可以實(shí)現(xiàn)關(guān)聯(lián)更新,當(dāng)然,這樣的知識(shí)相對(duì)比較基礎(chǔ),資深或者高級(jí)專(zhuān)業(yè)人士請(qǐng)繞行,以免留下笑柄,但如果你記得不是很清楚,或者還不是很確定,可以嘗試往下看看。同時(shí),在面試過(guò)程中,也經(jīng)常會(huì)問(wèn)起這樣的問(wèn)題,以考察候選人的基礎(chǔ)知識(shí)掌握水平。

一、準(zhǔn)備工作

我們首先創(chuàng)建演示用的數(shù)據(jù)庫(kù)表,一張是訂單表,里面包含了商品id和商品名稱(chēng),一張是商品表,保存了商品的基本信息,兩張表通過(guò)商品id進(jìn)行關(guān)聯(lián),創(chuàng)建完成后,我們向表中插入一些簡(jiǎn)單的測(cè)試數(shù)據(jù)。

首先創(chuàng)建兩張表:

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 '商品名稱(chēng)',
  `amout` decimal(10,2) DEFAULT NULL COMMENT '訂單金額',
  `order_time` timestamp NULL DEFAULT NULL COMMENT '下單時(shí)間',
  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 '商品名稱(chēng)',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

再插入一些簡(jiǎn)單的測(cè)試數(shù)據(jù):

INSERT INTO `t_order` VALUES ('1', '1', '科幻圖書(shū)', '25.00', '2023-08-21 17:16:54');
INSERT INTO `t_order` VALUES ('2', '2', '臺(tái)燈', '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', '編程書(shū)籍', '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');

執(zhí)行上面的sql后,表中的數(shù)據(jù)是這樣的:

f29b2c584e50c31d85bb63e6f9ec5fe0.png

730b530f8ca2cb1334b25d0309695449.png

二、通過(guò)JOIN進(jìn)行關(guān)聯(lián)更新

也就是通過(guò)INNER JOIN或者LEFT JOIN進(jìn)行關(guān)聯(lián)更新,當(dāng)然,使用RIGHT JOIN也可以,只不過(guò)關(guān)聯(lián)的主表變成了右邊的那張,更多是一個(gè)習(xí)慣問(wèn)題。我們先看看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如上所示,它把訂單表中的商品名稱(chēng)字段值更新為商品表中的商品名稱(chēng),更新后訂單表的結(jié)果如下:

a3e40a0093ea7dba1a001ba8841e869b.png

可以看到,product_id等于1和2的商品名稱(chēng),已經(jīng)更新為商品表中的最新結(jié)果,之前的商品名稱(chēng)分別為科幻圖片和臺(tái)燈,執(zhí)行sql后,更新為商品表中對(duì)應(yīng)id的名稱(chēng),分別為編程書(shū)籍和電飯鍋。執(zhí)行信息顯示,有兩行數(shù)據(jù)受到了影響。

上面是用INNER JOIN進(jìn)行更新,如果使用LEFT JOIN(sql不用任何其它修改,只把INNER換成LEFT即可),結(jié)果稍有不同:

4fdf4190a994a84ea5b8ba007e74dfed.png

可以看到,product_id=128的記錄,它的商品名稱(chēng)被更新為NULL值了,而且執(zhí)行信息也顯示,有三行數(shù)據(jù)受到了影響。這主要是因?yàn)閮?nèi)聯(lián)接和左聯(lián)接的處理邏輯不同,INNER JOIN是強(qiáng)關(guān)聯(lián),而對(duì)LEFT JOIN來(lái)說(shuō),即使副表沒(méi)有滿足條件的數(shù)據(jù),也會(huì)處理成NULL,詳細(xì)區(qū)別可參考相關(guān)資料。

三、通過(guò)子查詢進(jìn)行處理

可以通過(guò)子查詢的方式進(jìn)行關(guān)聯(lián)更新:

UPDATE t_order t
SET t.product_name =
 (SELECT product_name FROM t_product p WHERE t.product_id = p.id)

更新操作也是影響了三行數(shù)據(jù),同時(shí),對(duì)于product_id=128的數(shù)據(jù),它的商品名稱(chēng)更新為NULL值,跟LEFT JOIN的效果一樣:

32c63902c0a187a0b9bce785ba0dd40f.png

四、直接UPDATE多表

根據(jù)UPDATE語(yǔ)法規(guī)則,它后面可以直接跟隨多個(gè)表,表之間使用逗號(hào)分隔:

UPDATE t_order o, t_product p 
SET o.product_name=p.product_name
WHERE o.product_id=p.id

執(zhí)行信息提示影響了2行數(shù)據(jù),它的效果跟INNER JOIN是一樣的,product_id=128的數(shù)據(jù)沒(méi)有被更新,還保持原狀:

714df2712161f31d38726789f6447079.png

五、結(jié)尾

多表關(guān)聯(lián)更新也是非常常見(jiàn)的業(yè)務(wù)場(chǎng)景,不光是編寫(xiě)代碼時(shí)會(huì)碰到這樣的需求,在數(shù)據(jù)庫(kù)運(yùn)維時(shí),也常常會(huì)做這樣的操作。完成這樣的需求,有多種不同的實(shí)現(xiàn)手段,我們從上面可以看到,這些方法之間也有些細(xì)微的差別:不滿足關(guān)聯(lián)條件的數(shù)據(jù)是否也進(jìn)行了更新。這個(gè)就依需求而定了。

以上就是MySQL進(jìn)行表之間關(guān)聯(lián)更新的實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL表之間關(guān)聯(lián)更新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • jdbc調(diào)用mysql存儲(chǔ)過(guò)程實(shí)現(xiàn)代碼

    jdbc調(diào)用mysql存儲(chǔ)過(guò)程實(shí)現(xiàn)代碼

    接下來(lái)將介紹下mysql存儲(chǔ)過(guò)程的創(chuàng)建及調(diào)用,調(diào)用時(shí)涉及到j(luò)dbc的知識(shí),不熟悉的朋友還要溫習(xí)下jdbc哦,話不多說(shuō)看代碼,希望可以幫助到你
    2013-03-03
  • MySQL數(shù)據(jù)表修改與管理的完整指南

    MySQL數(shù)據(jù)表修改與管理的完整指南

    在數(shù)據(jù)庫(kù)的日常使用中,我們經(jīng)常需要對(duì)已有的數(shù)據(jù)表進(jìn)行調(diào)整和優(yōu)化,無(wú)論是修改表結(jié)構(gòu)、刪除不再需要的表,還是管理臨時(shí)數(shù)據(jù),本文將全面講解MySQL數(shù)據(jù)表的修改、刪除和臨時(shí)表管理,讓你輕松應(yīng)對(duì)各種表管理需求,需要的朋友可以參考下
    2026-02-02
  • mysql Load Data InFile 的用法

    mysql Load Data InFile 的用法

    Load Data InFile是用于批量向數(shù)據(jù)表中導(dǎo)入記錄。
    2009-05-05
  • MySQL5.7主從配置實(shí)例解析

    MySQL5.7主從配置實(shí)例解析

    這篇文章主要為大家詳細(xì)解析了MySQL5.7主從配置的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 創(chuàng)建mysql表分區(qū)的方法

    創(chuàng)建mysql表分區(qū)的方法

    我來(lái)給大家介紹一下mysql表分區(qū)創(chuàng)建與使用吧,希望對(duì)各位同學(xué)會(huì)有所幫助。表分區(qū)的測(cè)試使用,主要內(nèi)容來(lái)自于其他博客文章以及mysql5.1的參考手冊(cè)。
    2013-10-10
  • mysql 5.7.17 安裝教程 附MySQL服務(wù)無(wú)法啟動(dòng)的解決方法

    mysql 5.7.17 安裝教程 附MySQL服務(wù)無(wú)法啟動(dòng)的解決方法

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17安裝教程,并且為大家分享了MySQL服務(wù)無(wú)法啟動(dòng)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 解決MySQL?Varchar?類(lèi)型尾部空格的問(wèn)題

    解決MySQL?Varchar?類(lèi)型尾部空格的問(wèn)題

    這篇文章主要介紹了MySQL?Varchar?類(lèi)型尾部空格,在這里需要注意的是?binary?排序規(guī)則的?pad?屬性為?NO?PAD,這里其實(shí)不是個(gè)例外,因?yàn)?char、varchar?和?text?類(lèi)型都?xì)w類(lèi)為?nonbinary,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2022-04-04
  • MySQL存粹問(wèn)題面試準(zhǔn)備總結(jié)大全

    MySQL存粹問(wèn)題面試準(zhǔn)備總結(jié)大全

    這篇文章主要介紹了MySQL存粹問(wèn)題面試準(zhǔn)備總結(jié)的相關(guān)資料,MySQL面試中常見(jiàn)問(wèn)題,包括但不限于事務(wù),索引,引擎,場(chǎng)景優(yōu)化等常見(jiàn)問(wèn)題,有助于面試前的準(zhǔn)備,需要的朋友可以參考下
    2026-05-05
  • Mysql中SUBSTRING函數(shù)的具體使用

    Mysql中SUBSTRING函數(shù)的具體使用

    本文主要介紹了Mysql中SUBSTRING函數(shù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 詳解Linux終端 MySQL常用操作指令

    詳解Linux終端 MySQL常用操作指令

    這篇文章主要介紹了Linux終端 MySQL常用操作指令的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論

乌兰县| 松滋市| 昌吉市| 绵竹市| 山阴县| 四平市| 巴彦县| 密山市| 巢湖市| 应城市| 长兴县| 自治县| 文山县| 威海市| 新邵县| 永昌县| 新化县| 三江| 田东县| 吉木乃县| 仙游县| 海伦市| 三亚市| 岳池县| 屏边| 桦南县| 鄂伦春自治旗| 沅江市| 隆子县| 南昌市| 诸暨市| 张家口市| 博野县| 西林县| 巢湖市| 江口县| 色达县| 东源县| 日照市| 会理县| 镇雄县|