鍍金池/ 問答/數(shù)據(jù)庫(kù)/ mysql存儲(chǔ)過(guò)程使用on duplicate key update無(wú)法正常up

mysql存儲(chǔ)過(guò)程使用on duplicate key update無(wú)法正常update

1、問題如標(biāo)題所示;
2、情況:
a、創(chuàng)建了存儲(chǔ)過(guò)程testPro
BEGIN

insert INTO test (uid,kNum,mNum) VALUES (`uid`,`kNum`,`mNum`)

ON DUPLICATE KEY UPDATE uid=`uid`,kNum=kNum+`kNum`,mNum=mNum+`mNum`;

END
輸入?yún)?shù)為
IN `uid` varchar(10),IN `kNum` int,IN `mNum` int

b、構(gòu)建表:
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`kNum` int(11) DEFAULT NULL,
`mNum` int(11) DEFAULT NULL,
`uid` varchar(10) NOT NULL,
PRIMARY KEY (`id`,`uid`),
UNIQUE KEY `ske` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

c、執(zhí)行調(diào)用:
call testPro('2017-11-24',0,1);
第一次調(diào)用結(jié)果:

clipboard.png

第二次調(diào)用結(jié)果:

clipboard.png

第三次調(diào)用時(shí),就不會(huì)再累加了,結(jié)果如第二次調(diào)用一樣;

但如果,我們此時(shí)累加kNum一次:
call testPro('2017-11-24',1,0);
結(jié)果會(huì)變成這樣:

clipboard.png

而且同樣不能再繼續(xù)累加;

請(qǐng)各位看看這到底是什么問題。網(wǎng)上能找的我應(yīng)該都找了,實(shí)在沒能找到解釋。最接近的也就這篇文章,但是試過(guò)沒有效果:https://yq.aliyun.com/ziliao/...

回答
編輯回答
孤毒

存儲(chǔ)過(guò)程的變量名不要和字段名一致,你換成a,b,c再試試

2017年4月21日 23:12
編輯回答
歆久

我直接復(fù)制你的表結(jié)構(gòu),sql語(yǔ)句,執(zhí)行沒有問題,會(huì)多次累加。但是,你的sql有點(diǎn)問題,每次是按照數(shù)據(jù)庫(kù)原有的值累加:kNum=kNum+kNum,mNum=mNum+mNum,并不是數(shù)據(jù)庫(kù)里的值 加上新的值。
正確的sql是:
INSERT INTO test (uid,kNum,mNum) VALUES ('2012', 0, 1) ON DUPLICATE KEY UPDATE uid=uid,kNum=VALUES(kNum)+kNum,mNum=VALUES(mNum)+mNum;

即:kNum=VALUES(kNum)+kNum

2018年5月30日 18:20