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

MySQL多個(gè)表的關(guān)聯(lián)字段實(shí)現(xiàn)同步更新的解決方案

 更新時(shí)間:2024年11月19日 11:50:42   作者:離開(kāi)地球表面_99  
在對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)進(jìn)行設(shè)計(jì)時(shí),為了提高查詢(xún)效率,會(huì)進(jìn)行一些反規(guī)范化設(shè)計(jì),如:設(shè)計(jì)一些冗余字段,但這樣可能會(huì)存在數(shù)據(jù)同步問(wèn)題,故本文給大家介紹了MySQL多個(gè)表的關(guān)聯(lián)字段實(shí)現(xiàn)同步更新的解決方案,需要的朋友可以參考下

1. 背景

在對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)進(jìn)行設(shè)計(jì)時(shí),為了提高查詢(xún)效率,會(huì)進(jìn)行一些反規(guī)范化設(shè)計(jì),如:設(shè)計(jì)一些冗余字段。但這樣可能會(huì)存在數(shù)據(jù)同步問(wèn)題,當(dāng)源表字段值更新時(shí),冗余字段值也需要同步更新。

現(xiàn)有產(chǎn)品表 product ,移動(dòng)端版本 mobile_version ,授權(quán)綁定產(chǎn)品表auth_server_product 三個(gè)表,這三個(gè)表有一個(gè)共同字段 productName,期望當(dāng) product 表中的 productName 字段的值改變時(shí),將該字段修改后的值同步更新到 mobile_version,auth_server_product 兩個(gè)表中。

1.1 表結(jié)構(gòu)定義

1.1.1 product 表

CREATE TABLE `product`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `productName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `product` VALUES (1, '產(chǎn)品A');
INSERT INTO `product` VALUES (2, '產(chǎn)品B');
INSERT INTO `product` VALUES (3, '產(chǎn)品C');

1.1.2 auth_server_product 表

CREATE TABLE `auth_server_product`  (
  `id` int(0) NOT NULL,
  `authId` int(0) NULL DEFAULT NULL,
  `productId` int(0) NULL DEFAULT NULL,
  `productName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `auth_server_product` VALUES (1, 1, 1, '產(chǎn)品A');
INSERT INTO `auth_server_product` VALUES (2, 1, 2, '產(chǎn)品B');
INSERT INTO `auth_server_product` VALUES (3, 1, 3, '產(chǎn)品C');

1.1.3 mobile_version 表

CREATE TABLE `mobile_version`  (
  `id` int(0) NOT NULL,
  `mobile_version` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `productId` int(0) NULL DEFAULT NULL,
  `productName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;


INSERT INTO `mobile_version` VALUES (1, 'V1.0.0', 1, '產(chǎn)品A');
INSERT INTO `mobile_version` VALUES (2, 'V1.0.1', 1, '產(chǎn)品A');

2. 解決方案

2.1 應(yīng)用層代碼中更新

代碼層實(shí)現(xiàn)數(shù)據(jù)同步邏輯,在更新 product 表中的 productName 字段時(shí),同步更新auth_server_product 與 mobile_version 兩表中的字段值。大致邏輯如下:

@Transactional
public void updateProductName(String oldProductName, String newProductName) {
    // 更新 product 表中的 productName
    productRepository.updateProductName(oldProductName, newProductName);
    
    // 同步更新 mobile_version 表
    mobileVersionRepository.updateProductName(oldProductName, newProductName);

    // 同步更新 auth_server_product 表
    authServerProductRepository.updateProductName(oldProductName, newProductName);
}

該種方案的劣勢(shì)

  • 代碼復(fù)雜,耦合性強(qiáng);
  • 數(shù)據(jù)不一致:如果同步邏輯沒(méi)有被正確實(shí)現(xiàn)或處理,可能會(huì)導(dǎo)致數(shù)據(jù)不一致。

2.2 利用MySQL提供的觸發(fā)器功能

MySQL 提供了觸發(fā)器功能,在隨某個(gè)表進(jìn)行記錄的新增(INSERT)、修改(UPDATE) 或是刪除( DELETE) 操作時(shí),會(huì)自動(dòng)觸發(fā)相應(yīng)的操作。

針對(duì)上述場(chǎng)景中的這個(gè)問(wèn)題,可以在 product 表設(shè)置觸發(fā)器,在 UPDATE 操作時(shí),通過(guò)觸發(fā)器來(lái)同步更新 mobile_versionauth_server_product 表中的 productName 字段。

2.2.1 具體實(shí)現(xiàn)

Navicat 為例進(jìn)行演示

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

設(shè)計(jì) procut 表,點(diǎn)擊觸發(fā)器,定義觸發(fā)器的名稱(chēng),類(lèi)型選擇AFTER UPDATE,表示在product 表中的 productName 更新后 同步更新其他表。

Step 2 : SQL 定義觸發(fā)器行為

編寫(xiě)具體的SQL語(yǔ)句定義觸發(fā)器行為,在這個(gè)例子中,期望在 productName 更新時(shí),自動(dòng)更新 mobile_versionauth_server_product 表中的 productName。SQL 下:

BEGIN
    -- 如果 productName 發(fā)生變化
    IF OLD.productName <> NEW.productName THEN
        -- 更新 mobile_version 表中的 productName
        UPDATE mobile_version
        SET productName = NEW.productName
        WHERE productName = OLD.productName;
        
        -- 更新 auth_server_product 表中的 productName
        UPDATE auth_server_product
        SET productName = NEW.productName
        WHERE productName = OLD.productName;
    END IF;
END 

Step 3 : 驗(yàn)證

  • show triggers,可查看當(dāng)前數(shù)據(jù)庫(kù)中的觸發(fā)器,驗(yàn)證觸發(fā)器是否創(chuàng)建成功。

  • 執(zhí)行更新語(yǔ)句,驗(yàn)證觸發(fā)器的定義能否達(dá)到期望的效果。
update product set productName = '產(chǎn)品AA' where id = '1'

可以看到,當(dāng) product 表中的 productName 值更新后,mobile_version 與 auth_server_product 對(duì)應(yīng)的 productName 值同步更新。

2.2.2 關(guān)于觸發(fā)器

  • 觸發(fā)事件:觸發(fā)器會(huì)在某個(gè)特定事件發(fā)生時(shí)被觸發(fā)。常見(jiàn)的觸發(fā)事件包括:

    • INSERT:在插入數(shù)據(jù)時(shí)觸發(fā)。
    • UPDATE:在更新數(shù)據(jù)時(shí)觸發(fā)。
    • DELETE:在刪除數(shù)據(jù)時(shí)觸發(fā)。
  • 觸發(fā)時(shí)機(jī):觸發(fā)器可以定義在數(shù)據(jù)事件發(fā)生的 BEFORE)或 AFTER)執(zhí)行。

    • BEFORE:觸發(fā)器在數(shù)據(jù)變更之前執(zhí)行。
    • AFTER:觸發(fā)器在數(shù)據(jù)變更之后執(zhí)行。
  • 觸發(fā)器的作用域:觸發(fā)器通常綁定到某個(gè)表上,并且只能在該表的數(shù)據(jù)操作時(shí)觸發(fā)。它不能跨表執(zhí)行,也不能直接返回?cái)?shù)據(jù)。

以上就是MySQL多個(gè)表的關(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)文章

  • MySQL服務(wù)器線程數(shù)的查看方法詳解

    MySQL服務(wù)器線程數(shù)的查看方法詳解

    這篇文章主要介紹了MySQL服務(wù)器線程數(shù)的查看方法,結(jié)合實(shí)例形式分析了mysql線程數(shù)查看的相關(guān)命令、配置、參數(shù)及相關(guān)使用技巧,需要的朋友可以參考下
    2018-03-03
  • MySQL中關(guān)于臨時(shí)表的一些基本使用方法

    MySQL中關(guān)于臨時(shí)表的一些基本使用方法

    這篇文章主要介紹了MySQL中關(guān)于臨時(shí)表的一些基本使用方法,是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • MySql5.7.18字符集配置圖文詳解

    MySql5.7.18字符集配置圖文詳解

    本文通過(guò)圖文并茂的形式給大家介紹了mysql5.7.18字符集配置教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-06-06
  • linux下mysql 5.1 和 5.7的安裝教程

    linux下mysql 5.1 和 5.7的安裝教程

    下面小編就為大家分享一篇linux下mysql 5.1 和 5.7的安裝教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • MySql command line client命令操作大全

    MySql command line client命令操作大全

    這篇文章主要介紹了MySql command line client命令操作大全,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 全面解析MySQL?Explain如何優(yōu)化SQL查詢(xún)性能

    全面解析MySQL?Explain如何優(yōu)化SQL查詢(xún)性能

    在?MySQL?中,EXPLAIN?關(guān)鍵字可以幫助我們分析查詢(xún)執(zhí)行計(jì)劃,從而優(yōu)化查詢(xún)性能,所以本文就來(lái)和大家詳細(xì)講講Explain是如何優(yōu)化SQL查詢(xún)性能的
    2023-05-05
  • mysql高效查詢(xún)left join和group by(加索引)

    mysql高效查詢(xún)left join和group by(加索引)

    這篇文章主要給大家介紹了關(guān)于mysql高效查詢(xún)left join和group by,這個(gè)的前提是加了索引,以及如何在MySQL高效的join3個(gè)表 的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • mysql Out of memory (Needed 16777224 bytes)的錯(cuò)誤解決

    mysql Out of memory (Needed 16777224 bytes)的錯(cuò)誤解決

    至于我改的這幾個(gè)值是不是正確的解決方法,目前還不知道。先貼出來(lái)
    2012-07-07
  • MySQL查詢(xún)優(yōu)化之查詢(xún)慢原因和解決技巧

    MySQL查詢(xún)優(yōu)化之查詢(xún)慢原因和解決技巧

    這篇文章主要介紹了MySQL查詢(xún)優(yōu)化之查詢(xún)慢原因和解決技巧,內(nèi)容講解的很詳細(xì),有對(duì)于這方面不太懂的同學(xué)可以研究一下。
    2021-02-02
  • mysql表的內(nèi)連和外連實(shí)戰(zhàn)記錄

    mysql表的內(nèi)連和外連實(shí)戰(zhàn)記錄

    在開(kāi)發(fā)中我們的業(yè)務(wù)需求有時(shí)候是復(fù)雜的,多張表聯(lián)合查詢(xún)的時(shí)候是有多種方式的,面對(duì)不同的需求,靈活使用不同的表連接方式,這篇文章主要給大家介紹了關(guān)于mysql表內(nèi)連和外連的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

吴川市| 饶阳县| 建湖县| 宝应县| 苍梧县| 满洲里市| 温州市| 武宁县| 芦山县| 当雄县| 凌云县| 自治县| 新邵县| 白城市| 安平县| 什邡市| 伊春市| 沾益县| 凭祥市| 寻乌县| 徐汇区| 六盘水市| 瑞金市| 阳高县| 黔江区| 琼中| 中方县| 南投县| 安庆市| 武宣县| 青海省| 平昌县| 卓尼县| 临澧县| 祥云县| 沙田区| 诸暨市| 昌乐县| 南江县| 古蔺县| 乌苏市|