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

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

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

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

業(yè)務(wù)場景

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

觸發(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;

校驗代碼

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;

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

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

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

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

一開始我使用的after,然后對自身的值進行更改。

insertupdatedelete
oldnull實際值實際值
new實際值實際值null

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

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

問題的起源

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

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

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

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

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

這個做法對的,因為這樣使用new先對當(dāng)前的金額改變了,然后存到數(shù)據(jù)庫中的,不用使用update consumeinfo。

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

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

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

其實還是因為new不能在after進行賦值,只能進行讀取,復(fù)制要在before時賦值。

new和old的使用情況

下面具體說說old和new的使用情況。

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

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

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

如果使用after不能使用new賦值,只能取值,否則會出錯誤,比如

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

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

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

總結(jié)

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

old在用于取值?因為賦值沒意義?

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

相關(guān)文章

最新評論

乐平市| 西和县| 昭觉县| 翼城县| 广德县| 罗山县| 门头沟区| 九江市| 夏邑县| 常宁市| 大田县| 和龙市| 互助| 阿瓦提县| 仪陇县| 安吉县| 凤山市| 凤山县| 德州市| 墨江| 武隆县| 安塞县| 龙江县| 比如县| 凤阳县| 白玉县| 太仓市| 兴山县| 霍城县| 西丰县| 新化县| 德钦县| 黑龙江省| 当雄县| 启东市| 彭山县| 秦安县| 荔浦县| 合川市| 临高县| 大渡口区|