欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql觸發(fā)器字段雙向更新方式

 更新時(shí)間:2023年08月30日 09:34:50   作者:大鵬的世界  
這篇文章主要介紹了Mysql觸發(fā)器字段雙向更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mysql觸發(fā)器字段雙向更新

業(yè)務(wù)場(chǎng)景

不同的業(yè)務(wù)系統(tǒng)共用余額,hjmallind_user和ims_cjdc_user兩個(gè)表不同的余額字段,但是共用余額值。

觸發(fā)器定義

DROP TRIGGER IF EXISTS `test-up_ds_wallet`;
CREATE  TRIGGER `test-up_ds_wallet` AFTER UPDATE ON `ims_cjdc_user` 
    FOR EACH ROW 
    BEGIN
        DECLARE ds_money decimal(10,2);
        IF new.wallet <> old.wallet THEN
            select money into ds_money from hjmallind_user where ptuserid=new.id;
            #解決觸發(fā)器死循環(huán)
            IF ds_money <> new.wallet THEN
                UPDATE hjmallind_user set money=new.wallet where ptuserid=new.id;
            END IF ;
      END IF ;
    END;
DROP TRIGGER IF EXISTS `test-up_wm_wallet`;
CREATE  TRIGGER `test-up_wm_wallet` AFTER UPDATE ON `hjmallind_user` 
    FOR EACH ROW 
    BEGIN
        DECLARE wm_wallet decimal(10,2);
        IF new.money <> old.money THEN
            select wallet into wm_wallet from ims_cjdc_user where id=new.ptuserid;
            #解決觸發(fā)器死循環(huán)
            IF wm_wallet <> new.money THEN
                UPDATE ims_cjdc_user set wallet=new.money where id=new.ptuserid;
            END IF ;
        END IF ;
    END;

校驗(yàn)代碼

select id,wallet from ims_cjdc_user where id=164438;
select id,ptuserid,money from hjmallind_user where ptuserid=164438;
-- update hjmallind_user set money=money+50 where ptuserid=8426;
update ims_cjdc_user set wallet=wallet+20.50 where id=164438;
select id,wallet from ims_cjdc_user where id=164438;
select id,ptuserid,money from hjmallind_user where ptuserid=164438;

對(duì)數(shù)據(jù)庫(kù)觸發(fā)器new和old的理解

在數(shù)據(jù)庫(kù)的觸發(fā)器中經(jīng)常會(huì)用到更新前的值和更新后的值,所有要理解new和old的作用很重要。

當(dāng)時(shí)我有個(gè)情況是這樣的:

我要插入一行數(shù)據(jù),在行要去其他表中獲得一個(gè)單價(jià),然后和這行的數(shù)據(jù)進(jìn)行相乘的到總金額,將該行的金額替換成相乘的結(jié)果。

一開(kāi)始我使用的after,然后對(duì)自身的值進(jìn)行更改。

insertupdatedelete
oldnull實(shí)際值實(shí)際值
new實(shí)際值實(shí)際值null

在Oracle中用 :old :new 表示執(zhí)行前的行,和執(zhí)行后的行。

在MySQL中用 old new 表示執(zhí)行前和執(zhí)行后的數(shù)據(jù)。

問(wèn)題的起源

之前對(duì)數(shù)據(jù)庫(kù)的觸發(fā)器是這樣寫(xiě)的,

CREATE TRIGGER triggerName after insert ON consumeinfo
    FOR EACH ROW
    BEGIN
      UPDATE consumeinfo SET new.金額=0;
    END;

觸發(fā)器創(chuàng)建沒(méi)問(wèn)題,但是插入數(shù)據(jù)出現(xiàn)以下錯(cuò)誤。

[Err] 1442 - Can't update table 'consumeinfo' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

但是通過(guò)上網(wǎng)搜索的結(jié)果說(shuō)對(duì)本表進(jìn)行修改不用使用 update consumeinfo ,直接使用 SET new.金額=0

這個(gè)做法對(duì)的,因?yàn)檫@樣使用new先對(duì)當(dāng)前的金額改變了,然后存到數(shù)據(jù)庫(kù)中的,不用使用update consumeinfo。

經(jīng)過(guò)一番努力,以下是成功后的代碼,貼出來(lái)看看

CREATE TRIGGER addnewReco BEFORE INSERT ON consumeinfo FOR EACH ROW
BEGIN
SET new.金額 = (
    SELECT `單價(jià)`
    FROM pricenow
    WHERE `類型` = new.類型
    ) * new.數(shù)量;
END;

后來(lái)在吃飯打湯喝的時(shí)候突然想到new和old在after和before上使用情況不同。

其實(shí)還是因?yàn)閚ew不能在after進(jìn)行賦值,只能進(jìn)行讀取,復(fù)制要在before時(shí)賦值。

new和old的使用情況

下面具體說(shuō)說(shuō)old和new的使用情況。

在對(duì)new賦值的時(shí)候只能在觸發(fā)器before中只用,在after中是不能使用的,比如(以下是正確的)。

CREATE TRIGGER updateprice
BEFORE insert
ON consumeinfo
FOR EACH ROW
BEGIN
   set new.金額=0;
END;

這個(gè)說(shuō)明對(duì)當(dāng)前插入數(shù)據(jù)進(jìn)行更新的時(shí)候使用before先更新完,然后才插入到數(shù)據(jù)庫(kù)中的,在after的觸發(fā)器中,new的賦值已經(jīng)結(jié)束了,只能讀取內(nèi)容。

如果使用after不能使用new賦值,只能取值,否則會(huì)出錯(cuò)誤,比如

CREATE TRIGGER updateprice
AFTER insert
ON consumeinfo
FOR EACH ROW
BEGIN
    set new.金額=0;
END;

出現(xiàn)這樣的錯(cuò)誤:

[Err] 1362 - Updating of NEW row is not allowed in after trigger

總結(jié)

new在before觸發(fā)器中賦值,取值;在after觸發(fā)器中取值。

old在用于取值?因?yàn)橘x值沒(méi)意義?

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL分類排名和分組TOP N實(shí)例詳解

    MySQL分類排名和分組TOP N實(shí)例詳解

    大家好,本篇文章主要講的是MySQL分類排名和分組TOP N實(shí)例詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • mysql的3種分表方案

    mysql的3種分表方案

    這篇文章主要介紹了mysql的3種分表方案,先從為什么要分表說(shuō)起,然后分析了3種方法的優(yōu)劣勢(shì),最后做了一個(gè)總結(jié),需要的朋友可以參考下
    2014-05-05
  • MySQL5.6.22安裝配置方法圖文教程

    MySQL5.6.22安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了MySQL5.6.22安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 帶例子詳解Sql中Union和Union?ALL的區(qū)別

    帶例子詳解Sql中Union和Union?ALL的區(qū)別

    這篇文章主要介紹了帶例子詳解Sql中Union和Union?ALL的區(qū)別,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的完整實(shí)例

    mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于mysql從一張表查詢批量數(shù)據(jù)并插入到另一表中的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • mysql定時(shí)任務(wù)(event事件)實(shí)現(xiàn)詳解

    mysql定時(shí)任務(wù)(event事件)實(shí)現(xiàn)詳解

    這篇文章主要介紹了mysql定時(shí)任務(wù)(event事件)實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • MySQL學(xué)習(xí)筆記5:修改表(alter table)

    MySQL學(xué)習(xí)筆記5:修改表(alter table)

    我們?cè)趧?chuàng)建表的過(guò)程中難免會(huì)考慮不周,因此后期會(huì)修改表修改表需要用到alter table修改表語(yǔ)句,接下來(lái)詳細(xì)介紹,需要的朋友可以參考下
    2013-01-01
  • MySQL ALTER語(yǔ)法的運(yùn)用方法

    MySQL ALTER語(yǔ)法的運(yùn)用方法

    我們今天主要向大家介紹的是MySQL ALTER語(yǔ)法的實(shí)際運(yùn)用,如果你對(duì)這一技術(shù),心存好奇的話,以下的文章將會(huì)揭開(kāi)它的神秘面紗。
    2010-11-11
  • MySQL中int?(10)?和?int?(11)?的區(qū)別

    MySQL中int?(10)?和?int?(11)?的區(qū)別

    這篇文章主要介紹了MySQL中int?(10)?和?int?(11)?的區(qū)別,根據(jù)mysql?中整數(shù)數(shù)據(jù)類型、不同類型的取值范圍、不同數(shù)據(jù)類型的默認(rèn)顯示寬度展開(kāi)對(duì)int的介紹,需要的朋友可以參考一下
    2022-01-01
  • Mysql日志文件和日志類型介紹

    Mysql日志文件和日志類型介紹

    這篇文章主要介紹了Mysql日志文件和日志類型介紹,本文講解了日志文件類型、錯(cuò)誤日志、通用查詢?nèi)罩?、慢速查詢?nèi)罩尽⒍M(jìn)制日志等內(nèi)容,需要的朋友可以參考下
    2014-12-12

最新評(píng)論